วิธีทำบางสิ่งบางอย่างกับแต่ละไฟล์ในไดเรกทอรีที่มีชุดสคริปต์


265

คุณวนซ้ำแต่ละไฟล์ในไดเรกทอรีด้วยไฟล์. bat หรือ. cmd อย่างไร

เพื่อความง่ายโปรดให้คำตอบที่สะท้อนถึงชื่อไฟล์หรือเส้นทางของไฟล์

คำตอบ:


348

การใช้บรรทัดคำสั่ง:

for /f %f in ('dir /b c:\') do echo %f

การใช้ไฟล์แบทช์:

for /f %%f in ('dir /b c:\') do echo %%f

อัปเดต : หากไดเรกทอรีมีไฟล์ที่มีช่องว่างในชื่อคุณจะต้องเปลี่ยนตัวคั่นที่for /fคำสั่งใช้ ตัวอย่างเช่นคุณสามารถใช้ pipe char

for /f "delims=|" %%f in ('dir /b c:\') do echo %%f

อัปเดต 2 : (รวดเร็วหนึ่งปีครึ่งหลังจากคำตอบเดิม :-)) หากชื่อไดเรกทอรีมีช่องว่างในชื่อคุณสามารถใช้usebackqตัวเลือกในfor:

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files"`) do echo %%f

และหากคุณต้องการใช้การเปลี่ยนเส้นทางเอาต์พุตหรือการไพพ์คำสั่งให้ใช้ escape char ( ^):

for /f "usebackq delims=|" %%f in (`dir /b "c:\program files" ^| findstr /i microsoft`) do echo %%f

3
อย่างน้อยสำหรับบางคำสั่งตัวแปรไฟล์ควรอยู่ในเครื่องหมายคำพูดคู่
Jirka

1
ทำไม/fต้องหลังจากfor? ตามเอกสารความช่วยเหลือการ/fตั้งค่าสถานะจะเปิดและอ่านแต่ละไฟล์ จำเป็นต้องใช้เพื่อสะท้อนหรือเปลี่ยนชื่อไฟล์หรือไม่?
Snekse

17
/fหลังจากที่FORจำกัด ไปยังไฟล์ ในทำนองเดียวกัน/dจำกัด ไว้ที่ไดเรกทอรี (โฟลเดอร์) และ/rสั่งให้เรียกซ้ำ

3
+1 นี่คือคำตอบที่ยังมีชีวิตอยู่ ขอบคุณมาก.
Sabuncu

4
เพิ่งรู้ว่าคุณต้องใช้เครื่องหมายคำพูดย้อนกลับ ... แทนที่จะ'dir /b "c:\program files"'เป็น`dir /b "c:\program files"`
endavid

101

หรือใช้:

forfiles /s /m *.png /c "cmd /c echo @path"

คำสั่ง forfiles พร้อมใช้งานใน Windows Vista ขึ้นไป


1
มันยากที่จะใช้พา ธ ที่มีช่องว่างในเปลือก cmd ที่สอง ในตอนท้ายฉันปรับ% PATH% env var เพื่อให้งานเสร็จ แต่ขอบคุณ. เป็นประโยชน์
twobob

70

วิธีที่ง่ายที่สุด:

จาก Command Line ให้ใช้:

for %f in (*.*) do echo %f

จากไฟล์แบทช์ (เพิ่ม% เครื่องหมายเปอร์เซ็นต์ขึ้นสองเท่า):

for %%f in (*.*) do echo %%f

จาก Batch File พร้อมโฟลเดอร์ที่ระบุเป็นพารามิเตอร์ที่ 1:

for %%f in (%1\*.*) do echo %%f

8
ไม่เพียง แต่ที่ง่ายที่สุด แต่ยังมีนัยสำคัญสง่างามมากขึ้นเมื่อเทียบกับการประเมินการส่งออกด้วยdir /B for
syneticon-dj

5
เพิ่ม / r ก่อนหน้า% f เพื่อเรียกคืนไดเรกทอรีย่อย
PRMan

35

ใช้

for /r path %%var in (*.*) do some_command %%var

ด้วย:

  • เส้นทางเป็นเส้นทางเริ่มต้น
  • %% var เป็นตัวระบุบางอย่าง
  • *. * เป็น filemask หรือเนื้อหาของตัวแปร
  • some_command เป็นคำสั่งให้เรียกใช้งานด้วยพา ธ และ var ต่อกันเป็นพารามิเตอร์

2
ฉันได้รับข้อผิดพลาด: %%var was unexpected at this time.คุณสามารถยกตัวอย่างที่แน่นอนได้หรือไม่? ฉันลองชุดรูปแบบมากมายของfor /r . %%var in (*.*) do echo %%var
hippietrail

3
ด้วยเหตุผลที่แปลกประหลาดบางอย่างชื่อตัวแปรถูก จำกัด ไว้ที่หนึ่งอักขระ
ollb

2
เราสามารถใช้สัญลักษณ์แสดงอารมณ์ที่แตกต่างกันเพื่อผลลัพธ์ที่ต่างกันได้หรือไม่?
Silver Quettier

8

อีกวิธีหนึ่ง:

for %f in (*.mp4) do call ffmpeg -i "%~f" -vcodec copy -acodec copy "%~nf.avi"

"~ nf" หมายถึงอะไร
player0

@JudgeDredd "%~nf"ย่อมาจากชื่อของไฟล์ที่ไม่มีนามสกุลโดยที่fเป็นชื่อของตัวแปรที่ระบุในforส่วนหนึ่ง เอกสาร: docs.microsoft.com/en-us/previous-versions/windows/it-pro/ ......
Alph.Dev

-1

ฉันมีมัลแวร์บางตัวที่ทำเครื่องหมายไฟล์ทั้งหมดในไดเรกทอรีว่าซ่อนอยู่ / ระบบ / อ่านอย่างเดียว ถ้าคนอื่นพบว่าตัวเองอยู่ในสถานการณ์เช่นนี้ cd for /f "delims=|" %f in ('forfiles') do attrib -s -h -r %fลงในไดเรกทอรีและเรียกใช้

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