¿Cómo verificar si existe un archivo en un archivo por lotes?

186

Tengo que crear un .BATarchivo que haga esto:

  1. Si C:\myprogram\sync\data.handlerexiste, salga;
  2. Si C:\myprogram\html\data.sqlno existe, salga;
  3. En C:\myprogram\sync\eliminar todos los archivos y carpetas excepto ( test, test3y test2)
  4. Copiar C:\myprogram\html\data.sqlaC:\myprogram\sync\
  5. Llame a otro archivo por lotes con la opción sync.bat myprogram.ini.

Si fue en el entorno Bash, fue fácil para mí, pero no sé cómo probar si existe un archivo o carpeta y si es un archivo o carpeta.

cusspvz
fuente

Respuestas:

289

Puede usar IF EXIST para buscar un archivo:

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

Si no necesita un "más", puede hacer algo como esto:

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=

Aquí hay un ejemplo práctico de búsqueda de un archivo o una carpeta:

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
fuente
1
¿Cómo se comprueba la ruta completa con el nombre del archivo? Puntos de bonificación si la ruta contiene espacios. Como OP dijo, simple en BASH.
Nick
2
@Nick: Simple cmdtambién; por favor, haz una pregunta diferente, no cuestan mucho. Agregar un comentario de pregunta adicional a uno que tenga más de 3 años probablemente no obtenga muchas respuestas (pero primero marque SO para obtener respuestas a esta pregunta precisa, de lo contrario obtendrá su nueva pregunta marcada como un duplicado ...)
Magoo
8
Solo algo para notar del IF /?archivo de ayuda: The ELSE clause must occur on the same line as the command after the IF.Esto me quemó. Espero que te ayude.
funkymushroom
1
Recordatorio: IF, EXIST, ELSE, REM, DEL, etc.todos también funcionan en minúsculas.
Terra Ashley
1
para verificar si el archivo no existe, use If Not Exist "%FilePath% ( command ). Tenga en cuenta que el murciélago usa llaves en (lugar de llaves{
transang
10

Aquí hay un buen ejemplo sobre cómo hacer un comando si un archivo existe o no:

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

Tomaremos esos tres archivos y los colocaremos en un lugar temporal. Después de eliminar la carpeta, restaurará esos tres archivos.

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

Use el comando XCOPY :

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

Explicaré lo que /c /d /h /e /i /ysignifica:

  /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

Llame a otro archivo por lotes con la opción sync.bat myprogram.ini.

No estoy seguro de lo que quieres decir con esto, pero si solo quieres abrir ambos archivos, simplemente coloca la ruta del archivo como

Path/sync.bat
Path/myprogram.ini

Si fue en el entorno Bash, fue fácil para mí, pero no sé cómo probar si existe un archivo o carpeta y si es un archivo o carpeta.

Estás utilizando un archivo por lotes. Mencionó anteriormente que debe crear un archivo .bat para usar esto:

Tengo que crear un archivo .BAT que haga esto:

Avrumi Sherman
fuente
¿Qué suena con esta respuesta?
Avrumi Sherman