ใน Windows ไฟล์แบตช์ที่มีวนซ้ำสำหรับลูปและชื่อไฟล์รวมถึงช่องว่าง


9

ฉันมีโครงสร้างโฟลเดอร์เช่นนี้ (เป็นเพียงตัวอย่างเท่านั้นมันจะลึกลงไปในกรณีจริงของฉัน):

C:\test
|   
+---folder1
|       foo bar.txt
|       foobar.txt
|       
+---folder2
|       foo bar.txt
|       foobar.txt
|       
\---folder3
        foo bar.txt
        foobar.txt

ไฟล์ของฉันมีช่องว่างอย่างน้อยหนึ่งช่องในชื่อและฉันต้องการดำเนินการกับคำสั่งดังนั้นฉันจึงสนใจ foo bar.txt แต่ไม่ใช่ใน foobar.txt

ฉันพยายาม (ภายในไฟล์แบทช์):

for /r test %%f in (foo bar.txt) do if exist %%f echo %%f

echoที่คำสั่งเป็นที่เรียบง่าย
มันไม่ทำงานเพราะพื้นที่ถูกข้ามไปและฉันไม่ได้เอาต์พุต

ใช้งานได้ แต่ไม่ใช่สิ่งที่ฉันต้องการ:

for /r test %%f in (foobar.txt) do if exist %%f echo %%f

มันพิมพ์:

C:\test\folder1\foobar.txt
C:\test\folder2\foobar.txt
C:\test\folder3\foobar.txt

ฉันพยายามใช้เครื่องหมายคำพูด (") แต่มันไม่ทำงาน:

for /r test %%f in ("foo bar.txt") do if exist %%f echo %%f

ไม่ทำงานเนื่องจากเครื่องหมายคำพูดยังคงรวมอยู่ในผลลัพธ์:

C:\test\folder1\"foo bar.txt"
C:\test\folder2\"foo bar.txt"
C:\test\folder3\"foo bar.txt"

คำตอบ:



2

หากไม่มีสวิตช์แบบเรียกซ้ำคุณสามารถบอกFORไม่ให้พิมพ์เครื่องหมายคำพูด:

for %%f in ("foo bar.txt") do @if exist %%f echo %~dpnxf

คุณอาจจะสามารถทำFORงบที่ซ้อนกัน ด้านนอกจะเดินต้นไม้ไดเรกทอรีและด้านในจะเป็นหนึ่งข้างต้น


สวัสดีขอขอบคุณสำหรับคำตอบของคุณ ฉันแก้ไขคำถามต้นไม้สามารถลึกกว่าเพียงแค่ระดับเดียวและดังนั้นฉันต้องการ recursive
Alessandro Jacopson

2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...เรียกซ้ำได้ แต่จะมีบางสิ่งที่ต้องทำเพื่อให้ได้ผล คุณอาจต้องใช้การขยายที่ล่าช้าตัวอย่างเช่น SETLOCAL ENABLEDELAYEDEXPANSIONและ!varname!อื่น ๆ
Dennis Williamson

% ~ dpnf จะไม่ใส่นามสกุลไฟล์
dolmen

@dolmen: แก้ไขการพิมพ์ผิด
Dennis Williamson

2

คุณอาจต้องการดูคำสั่ง forfiles

forfiles /S /M "* *" /C "cmd /C echo @PATH"

'/ S' - เรียกซ้ำ ค้นหาไดเรกทอรีย่อยทั้งหมด

'/ M "* *"' - มาสก์ไฟล์ ค้นหาเฉพาะไฟล์ที่มีช่องว่างในชื่อของพวกเขา

'/ C "cmd / C echo @PATH"' - คำสั่ง ใช้คำสั่งนี้กับไฟล์ทั้งหมดที่พบ

ตัวอย่างผลลัพธ์:

"C:\test\folder1\foo bar.txt"
"C:\test\folder2\foo bar.txt"
"C:\test\folder3\foo bar.txt"

0

การตั้งค่าสถานะfเป็นสิ่งที่คุณต้องได้รับชื่อไฟล์แน่นอน witout (เพื่อให้คุณสามารถใส่อัญประกาศถ้าคุณต้องการ) แต่เนื่องจากขัดแย้งกับชื่อตัวแปรที่คุณเลือกคุณจะต้องใช้ชื่ออื่น:

for /r test %%i in ("foo bar.txt") do echo %%~fi

นั่นไม่ถูกต้องสมบูรณ์ ไม่มีความขัดแย้งของชื่อตัวแปรและเครื่องหมายคำพูดถูกพิมพ์โดยคำสั่งที่คุณแสดง
Dennis Williamson

0

ขอบคุณเดนนิส! ฉันก็กำลังทำงานกับปัญหาที่เกือบจะเหมือนกัน ฉันต้องการไฟล์ค้างคาวที่ฉันสามารถส่งผ่าน parm อินพุตเป็นสตริงการค้นหาชื่อไฟล์ - ซ้ำผ่านไดเรกทอรี ในกรณีที่มันมีประโยชน์กับคนอื่นที่นี่เป็น

::+++++++++
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /R %%d in (.) do (
   for /f "usebackq" %%i in (`dir /b %%d ^| findstr /i %1`) do (
      echo Processing %%i
   )
)
endlocal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.