จะตรวจสอบว่าไฟล์มีอยู่ในไฟล์แบตช์ได้อย่างไร?


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
หนึ่งจะตรวจสอบเส้นทางแบบเต็มกับชื่อไฟล์ได้อย่างไร คะแนนโบนัสหากเส้นทางมีช่องว่าง อย่างที่ OP บอกไว้ง่ายๆใน BASH
Nick

2
@Nick: ง่ายcmdเกินไป - โปรดถามเป็นคำถามที่แตกต่าง - พวกเขาไม่เสียค่าใช้จ่ายมาก การเพิ่มความคิดเห็นคำถามเพิ่มเติมให้กับคนที่อายุมากกว่า 3 ปีไม่น่าจะเป็นคำตอบมากมาย (แต่ให้ตรวจสอบ SO ก่อนเพื่อหาคำตอบสำหรับคำถามที่แม่นยำนี้มิฉะนั้นคุณจะได้รับคำถามใหม่ของคุณที่ทำเครื่องหมายว่าซ้ำ ... )
Magoo

8
สิ่งที่ควรทราบจากIF /?ไฟล์ช่วยเหลือ: The ELSE clause must occur on the same line as the command after the IF.สิ่งนี้ทำให้ฉันผิดหวัง หวังว่ามันจะช่วยคุณ
funkymushroom

1
คำเตือน: หากมีอยู่, อื่น ๆ , REM, DEL ฯลฯ ทั้งหมดทำงานในตัวพิมพ์เล็กเช่นกัน!
Terra Ashley

1
If Not Exist "%FilePath% ( command )เพื่อตรวจสอบว่าไฟล์ได้อยู่ใช้ โปรดทราบว่าค้างคาวใช้เครื่องหมายปีกกา(แทนวงเล็บปีกกา{
transang

11

พิมพ์ IF /? เพื่อรับความช่วยเหลือเกี่ยวกับว่าจะอธิบายวิธีใช้ IF EXIST อย่างชัดเจน

ในการลบทรีที่สมบูรณ์ยกเว้นบางโฟลเดอร์ให้ดูคำตอบของคำถามนี้: Windows batch script เพื่อลบทุกอย่างในโฟลเดอร์ยกเว้นหนึ่งโฟลเดอร์

ในที่สุดการคัดลอกหมายถึงการโทร COPY และการเรียกไฟล์แบ็ตอื่นสามารถทำได้ดังนี้:

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 ที่ทำสิ่งนี้:


Rung กับคำตอบนี้คืออะไร?
Avrumi Sherman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.