Como verificar se existe um arquivo em um arquivo em lotes?

186

Eu tenho que criar um .BATarquivo que faça isso:

  1. Se C:\myprogram\sync\data.handlerexistir, saia;
  2. Se C:\myprogram\html\data.sqlnão existir, saia;
  3. Ao C:\myprogram\sync\excluir todos os arquivos e pastas, exceto ( test, test3e test2)
  4. Copiar C:\myprogram\html\data.sqlparaC:\myprogram\sync\
  5. Chamar outro arquivo batch com a opção sync.bat myprogram.ini.

Se estava no ambiente Bash, era fácil para mim, mas não sei como testar se existe um arquivo ou pasta e se é um arquivo ou pasta.

cusspvz
fonte

Respostas:

289

Você pode usar IF EXIST para verificar um arquivo:

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

Se você não precisa de um "else", pode fazer algo assim:

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=

Aqui está um exemplo prático de pesquisa por um arquivo ou uma pasta:

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
fonte
1
Como se verifica o caminho completo com o nome do arquivo? Pontos de bônus se o caminho contiver espaços. Como o OP disse, simples no BASH.
Nick
2
@ Nick: Simples cmdtambém - faça uma pergunta diferente - eles não custam muito. Não é provável que adicionar um comentário adicional a uma pergunta com mais de três anos receba muitas respostas (mas verifique primeiro o SO para obter respostas a essa pergunta precisa; caso contrário, sua nova pergunta será marcada como duplicada ...)
Magoo 12/01
8
Apenas algo a ser observado no IF /?arquivo de ajuda: The ELSE clause must occur on the same line as the command after the IF.Isso me queimou. espero que ajude você.
Funkymushroom
1
Lembrete: SE, EXISTE, MAIS, REM, DEL, etc., todos também funcionam em letras minúsculas!
Terra Ashley
1
para verificar se o arquivo não existe, use If Not Exist "%FilePath% ( command ). Observe que, bat usa aparelho em (vez de aparelho{
transang
11

Digite IF /? para obter ajuda sobre se, explica claramente como usar o IF EXIST.

Para excluir uma árvore completa, exceto algumas pastas, consulte a resposta desta pergunta: Script em lote do Windows para excluir tudo em uma pasta, exceto uma

Finalmente, copiar significa apenas chamar COPY e chamar outro arquivo bat, pode ser feito assim:

MYOTHERBATFILE.BAT sync.bat myprogram.ini
Patrick
fonte
10

Aqui está um bom exemplo de como executar um comando se um arquivo existe ou não:

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

Vamos pegar esses três arquivos e colocá-los em um local temporário. Após excluir a pasta, ele restaurará esses três arquivos.

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

Use o comando XCOPY :

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

Vou explicar o 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

Ligue para outro arquivo em lotes com a opção sync.bat myprogram.ini.

Não sei ao certo o que você quer dizer com isso, mas se você deseja apenas abrir esses dois arquivos, basta colocar o caminho do arquivo como

Path/sync.bat
Path/myprogram.ini

Se estava no ambiente Bash, era fácil para mim, mas não sei como testar se existe um arquivo ou pasta e se é um arquivo ou pasta.

Você está usando um arquivo em lotes. Você mencionou anteriormente que precisa criar um arquivo .bat para usar isso:

Eu tenho que criar um arquivo .BAT que faz isso:

Avrumi Sherman
fonte
O que é tocado com esta resposta?
precisa saber é o seguinte