Comment vérifier si un fichier existe dans un fichier batch?

186

Je dois créer un .BATfichier qui fait ceci:

  1. S'il C:\myprogram\sync\data.handlerexiste, quittez;
  2. S'il C:\myprogram\html\data.sqln'existe pas, quittez;
  3. Dans C:\myprogram\sync\supprimer tous les fichiers et dossiers sauf ( test, test3et test2)
  4. Copier C:\myprogram\html\data.sqlversC:\myprogram\sync\
  5. Appelez un autre fichier de commandes avec option sync.bat myprogram.ini.

Si c'était dans l'environnement Bash, c'était facile pour moi, mais je ne sais pas comment tester si un fichier ou un dossier existe et s'il s'agit d'un fichier ou d'un dossier.

cusspvz
la source

Réponses:

289

Vous pouvez utiliser IF EXIST pour rechercher un fichier:

IF EXIST "filename" (
  REM Do one thing
) ELSE (
  REM Do another thing
)

Si vous n'avez pas besoin d'un "autre", vous pouvez faire quelque chose comme ceci:

set __myVariable=
IF EXIST "C:\folder with space\myfile.txt" set __myVariable=C:\folder with space\myfile.txt
IF EXIST "C:\some other folder with space\myfile.txt" set __myVariable=C:\some other folder with space\myfile.txt
set __myVariable=

Voici un exemple de travail de recherche d'un fichier ou d'un dossier:

REM setup

echo "some text" > filename
mkdir "foldername"

REM finds file    

IF EXIST "filename" (
  ECHO file filename exists
) ELSE (
  ECHO file filename does not exist
)

REM does not find file

IF EXIST "filename2.txt" (
  ECHO file filename2.txt exists
) ELSE (
  ECHO file filename2.txt does not exist
)

REM folders must have a trailing backslash    

REM finds folder

IF EXIST "foldername\" (
  ECHO folder foldername exists
) ELSE (
  ECHO folder foldername does not exist
)

REM does not find folder

IF EXIST "filename\" (
  ECHO folder filename exists
) ELSE (
  ECHO folder filename does not exist
)
stuartd
la source
1
Comment vérifier le chemin complet avec le nom de fichier? Points bonus si le chemin contient des espaces. Comme OP l'a dit, simple dans BASH.
Nick
2
@Nick: Simple cmdaussi - veuillez poser une question différente - ils ne coûtent pas cher. Ajouter un autre commentaire de question à un commentaire de plus de 3 ans ne recueillera probablement pas beaucoup de réponses (mais vérifiez d'abord SO pour les réponses à cette question précise, sinon votre nouvelle question sera marquée comme un doublon ...)
Magoo
8
Juste quelque chose à noter dans le IF /?fichier d'aide: The ELSE clause must occur on the same line as the command after the IF.Cela m'a brûlé. j'espère que cela vous aide.
funkymushroom
1
Rappel: IF, EXIST, ELSE, REM, DEL, etc. fonctionnent tous également en minuscules!
Terra Ashley
1
pour vérifier si le fichier n'existe pas, utilisez If Not Exist "%FilePath% ( command ). Notez que la chauve-souris utilise des accolades (au lieu d'accolades{
transposé
11

Tapez IF /? pour obtenir de l'aide, il explique clairement comment utiliser IF EXIST.

Pour supprimer une arborescence complète à l'exception de certains dossiers, consultez la réponse à cette question: Script batch Windows pour supprimer tout ce qui se trouve dans un dossier sauf un

Enfin, copier signifie simplement appeler COPY et appeler un autre fichier bat peut être fait comme ceci:

MYOTHERBATFILE.BAT sync.bat myprogram.ini
Patrick
la source
10

Voici un bon exemple sur la façon de faire une commande si un fichier existe ou non:

if exist C:\myprogram\sync\data.handler echo Now Exiting && Exit
if not exist C:\myprogram\html\data.sql Exit

Nous prendrons ces trois fichiers et les mettrons dans un endroit temporaire. Après avoir supprimé le dossier, il restaurera ces trois fichiers.

xcopy "test" "C:\temp"
xcopy "test2" "C:\temp"
del C:\myprogram\sync\
xcopy "C:\temp" "test"
xcopy "C:\temp" "test2"
del "c:\temp"

Utilisez la commande XCOPY :

xcopy "C:\myprogram\html\data.sql"  /c /d /h /e /i /y  "C:\myprogram\sync\"

Je vais expliquer ce que /c /d /h /e /i /ysignifie:

  /C           Continues copying even if errors occur.
  /D:m-d-y     Copies files changed on or after the specified date.
               If no date is given, copies only those files whose
               source time is newer than the destination time.
  /H           Copies hidden and system files also.
  /E           Copies directories and subdirectories, including empty ones.
               Same as /S /E. May be used to modify /T.
  /T           Creates directory structure, but does not copy files. Does not
               include empty directories or subdirectories. /T /E includes
  /I           If destination does not exist and copying more than one file,
               assumes that destination must be a directory.
  /Y           Suppresses prompting to confirm you want to overwrite an
               existing destination file.

`To see all the commands type`xcopy /? in cmd

Appelez un autre fichier batch avec l'option sync.bat myprogram.ini.

Je ne suis pas sûr de ce que vous entendez par là, mais si vous voulez simplement ouvrir ces deux fichiers, il vous suffit de mettre le chemin du fichier comme

Path/sync.bat
Path/myprogram.ini

Si c'était dans l'environnement Bash, c'était facile pour moi, mais je ne sais pas comment tester si un fichier ou un dossier existe et s'il s'agit d'un fichier ou d'un dossier.

Vous utilisez un fichier batch. Vous avez mentionné précédemment que vous devez créer un fichier .bat pour utiliser ceci:

Je dois créer un fichier .BAT qui fait ceci:

Avrumi Sherman
la source
Qu'est-ce que Rung avec cette réponse?
Avrumi Sherman