Trong Windows, một tệp bó với vòng lặp đệ quy và tên tệp bao gồm khoảng trắng


9

Tôi có một cây thư mục, như thế này (nó chỉ là một ví dụ, nó sẽ sâu hơn trong trường hợp thực tế của tôi):

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

Các tệp của tôi có một hoặc nhiều khoảng trắng trong tên và tôi cần thực hiện một lệnh trên chúng, vì vậy tôi quan tâm đến foo bar.txt nhưng không phải trong foobar.txt.

Tôi đã thử (bên trong một tệp bó):

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

trong đó lệnh là đơn giản echo.
Nó không hoạt động vì không gian bị bỏ qua và tôi không nhận được đầu ra.

Điều này hoạt động nhưng nó không phải là những gì tôi cần:

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

Nó in:

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

Tôi đã thử sử dụng dấu ngoặc kép (") nhưng nó không hoạt động:

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

Nó không hoạt động vì dấu ngoặc kép vẫn được bao gồm trong đầu ra:

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

Câu trả lời:


9

Còn cái này thì sao?

for /f "tokens=* delims=" %%a in ('dir "c:\test\foo bar.txt" /s /b') do (
echo %%a
)

ý tưởng tốt để di chuyển đệ quy trong dir! Cảm ơn bạn.
Alessandro Jacopson

2

Nếu không có công tắc đệ quy, bạn có thể yêu cầu FORkhông in dấu ngoặc kép:

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

Bạn có thể có thể làm FORbáo cáo lồng nhau . Bên ngoài sẽ đi bộ cây thư mục và bên trong sẽ là bên trên.


Xin chào, cảm ơn bạn đã trả lời. Tôi đã chỉnh sửa câu hỏi, cây có thể sâu hơn chỉ một cấp độ và vì vậy tôi cần đệ quy cho.
Alessandro Jacopson

2
@uvts_cvs: FOR /R %%d in (.) DO for %%f ...là đệ quy, nhưng sẽ có một số việc phải làm để làm cho nó hoạt động. Bạn có thể phải sử dụng mở rộng chậm, ví dụ. SETLOCAL ENABLEDELAYEDEXPANSION!varname!, vv
Tạm dừng cho đến khi có thông báo mới.

% ~ dpnf sẽ bỏ qua phần mở rộng tập tin.
heo

@dolmen: Sửa lỗi chính tả.
Tạm dừng cho đến khi có thông báo mới.

2

Bạn có thể muốn xem lệnh forfiles.

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

'/ S' - Đệ quy. Tìm kiếm tất cả các thư mục con

'/ M "* *"' - Mặt nạ tệp. Chỉ tìm kiếm các tập tin có một khoảng trắng trong tên của họ.

'/ C "cmd / C echo @PATH"' - Lệnh. Ban hành lệnh này trên tất cả các tập tin được tìm thấy.

Ví dụ đầu ra:

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

0

Cờ flà cái bạn cần để có được một trích dẫn witout tên tệp tuyệt đối (vì vậy bạn có thể đặt dấu ngoặc kép nếu bạn cần). Nhưng vì nó mâu thuẫn với tên biến bạn chọn, bạn phải sử dụng tên khác:

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

Điều đó hoàn toàn không chính xác. Không có xung đột tên biến và dấu ngoặc kép được in bằng lệnh bạn hiển thị.
Tạm dừng cho đến khi có thông báo mới.

0

Cảm ơn, Dennis! Tôi cũng đang làm việc về một vấn đề gần như giống hệt nhau. Tôi muốn có một tập tin bat mà tôi có thể chuyển trong một parm đầu vào dưới dạng chuỗi tìm kiếm cho tên tệp - đệ quy thông qua các thư mục. Chỉ trong trường hợp này là hữu ích cho người khác ở đây.

::+++++++++
@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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.