Як перевірити, чи існує файл у пакетному файлі?


186

Я повинен створити .BATфайл, який робить це:

  1. Якщо C:\myprogram\sync\data.handlerіснує, вийдіть;
  2. Якщо C:\myprogram\html\data.sqlйого немає, вийдіть;
  3. У C:\myprogram\sync\видалити всі файли і папки , за винятком ( test, test3і test2)
  4. Скопіювати C:\myprogram\html\data.sqlвC:\myprogram\sync\
  5. Виберіть інший пакетний файл з опцією sync.bat myprogram.ini.

Якщо це було в середовищі Bash, мені було легко, але я не знаю, як перевірити, чи існує файл чи папка і чи це файл чи папка.

Відповіді:


289

Ви можете використовувати IF EXIST для перевірки файлу:

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

Якщо вам не потрібно "ще", ви можете зробити щось подібне:

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=

Ось робочий приклад пошуку файлу чи папки:

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
)

1
Як перевірити повний шлях з назвою файлу? Бонусні бали, якщо шлях містить пробіли. Як сказав ОП, у BASH просто.
Нік

2
@Nick: cmdзанадто просто - будь ласка, задайте інше питання - вони не коштують багато. Додавання додаткового коментаря до питання, якому більше 3 років, швидше за все, не отримає багато відповідей (але спочатку перевірте ТАК для відповідей на це точне запитання, інакше ви отримаєте нове запитання, позначене як дублікат ...)
Магуо

8
Щось, що слід зазначити з IF /?довідкового файлу: The ELSE clause must occur on the same line as the command after the IF.Це спалило мене. сподіваюся, що тобі це допоможе.
funkymushroom

1
Нагадування: ЯКЩО, ІСНУЮЧИЙ, ELSE, REM, DEL та ін., Усі також працюють у малих літерах!
Терра Ешлі

1
щоб перевірити, чи файл не існує, використовуйте If Not Exist "%FilePath% ( command ). Зауважте, що кажан використовує дужки (замість фігурних брекетів{
трансанг

11

Введіть IF /? щоб отримати довідку про те, це чітко пояснює, як користуватися IF EXIST.

Щоб видалити повне дерево, за винятком деяких папок, див. Відповідь на це питання: Пакетний скрипт Windows для видалення всього в папці, крім однієї

Нарешті, копіювання просто означає зателефонувати COPY та викликати інший файл bat:

MYOTHERBATFILE.BAT sync.bat myprogram.ini

10

Ось хороший приклад того, як зробити команду, якщо файл є чи не існує:

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

Ми візьмемо ці три файли і покладемо їх у тимчасове місце. Після видалення папки вона відновить ці три файли.

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

Використовуйте команду XCOPY :

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

Я поясню, що /c /d /h /e /i /yозначає:

  /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

Викличте інший пакетний файл з опцією sync.bat myprogram.ini.

Я не впевнений, що ви маєте на увазі під цим, але якщо ви просто хочете відкрити обидва ці файли, ви просто покладете шлях до файлу, як

Path/sync.bat
Path/myprogram.ini

Якщо це було в середовищі Bash, мені було легко, але я не знаю, як перевірити, чи існує файл чи папка і чи це файл чи папка.

Ви використовуєте пакетний файл. Ви згадали раніше, що вам потрібно створити .bat файл, щоб використовувати це:

Я повинен створити .BAT файл, який робить це:


Що сталося з цією відповіддю?
Аврумі Шерман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.