Jak sprawdzić, czy plik istnieje w pliku wsadowym?

186

Muszę utworzyć .BATplik, który to robi:

  1. Jeśli C:\myprogram\sync\data.handleristnieje, wyjdź;
  2. Jeśli C:\myprogram\html\data.sqlnie istnieje, wyjdź;
  3. W C:\myprogram\sync\usunąć wszystkie pliki i foldery z wyjątkiem ( test, test3i test2)
  4. Skopiuj C:\myprogram\html\data.sqldoC:\myprogram\sync\
  5. Wywołaj inny plik wsadowy z opcją sync.bat myprogram.ini.

Jeśli było to w środowisku Bash, było to dla mnie łatwe, ale nie wiem, jak sprawdzić, czy plik lub folder istnieje i czy jest to plik lub folder.

cusspvz
źródło

Odpowiedzi:

289

Możesz użyć IF EXIST, aby sprawdzić plik:

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

Jeśli nie potrzebujesz „innego”, możesz zrobić coś takiego:

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=

Oto działający przykład wyszukiwania pliku lub folderu:

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
źródło
1
Jak sprawdzić pełną ścieżkę z nazwą pliku? Punkty bonusowe, jeśli ścieżka zawiera spacje. Jak powiedział OP, prosty w BASH.
Nick
2
@Nick: Proste cmdteż - zadaj inne pytanie - nie kosztują dużo. Dodanie kolejnego komentarza do pytania, które ma więcej niż 3 lata, prawdopodobnie nie przyniesie wielu odpowiedzi (ale najpierw sprawdź SO, aby uzyskać odpowiedzi na to dokładne pytanie, w przeciwnym razie nowe pytanie zostanie oznaczone jako duplikat ...)
Magoo
8
Po prostu coś do zapamiętania z IF /?pliku pomocy: The ELSE clause must occur on the same line as the command after the IF.To mnie spaliło. mam nadzieję, że ci to pomoże.
funkymushroom
1
Przypomnienie: JEŻELI, ISTNIEJĄ, ELSE, REM, DEL itd. Również działają małymi literami!
Terra Ashley,
1
aby sprawdzić, czy plik nie istnieje, użyj If Not Exist "%FilePath% ( command ). Zauważ, że nietoperz używa nawiasów klamrowych (zamiast nawiasów klamrowych{
transang
11

Wpisz IF /? aby uzyskać pomoc, jeśli, to wyraźnie wyjaśnia, jak używać JEŚLI ISTNIEJE.

Aby usunąć całe drzewo oprócz niektórych folderów, zobacz odpowiedź na to pytanie: skrypt wsadowy systemu Windows, aby usunąć wszystko w folderze oprócz jednego

Wreszcie kopiowanie oznacza po prostu wywołanie COPY, a wywołanie innego pliku nietoperza można wykonać w następujący sposób:

MYOTHERBATFILE.BAT sync.bat myprogram.ini
Patrick
źródło
10

Oto dobry przykład wykonania polecenia, jeśli plik istnieje lub nie istnieje:

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

Weźmiemy te trzy pliki i umieścimy je w tymczasowym miejscu. Po usunięciu folderu przywróci te trzy pliki.

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

Użyj polecenia XCOPY :

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

Wyjaśnię, co /c /d /h /e /i /yoznaczają:

  /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

Wywołaj inny plik wsadowy z opcją sync.bat myprogram.ini.

Nie jestem pewien, co masz na myśli, ale jeśli chcesz tylko otworzyć oba te pliki, po prostu umieść ścieżkę do pliku w następujący sposób

Path/sync.bat
Path/myprogram.ini

Jeśli było to w środowisku Bash, było to dla mnie łatwe, ale nie wiem, jak sprawdzić, czy plik lub folder istnieje i czy jest to plik lub folder.

Używasz pliku wsadowego. Wspomniałeś wcześniej, że musisz utworzyć plik .bat, aby użyć tego:

Muszę utworzyć plik .BAT, który to robi:

Avrumi Sherman
źródło
Co zadzwonił z tą odpowiedzią?
Avrumi Sherman