在Windows中,一个具有递归for循环的批处理文件,其文件名包括空格


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"

Answers:



2

如果没有递归开关,则可以告诉您FOR不要打印引号:

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

您也许可以执行嵌套FOR语句。外部将遍历目录树,内部将遍历目录树。


您好,谢谢您的回答。我编辑了问题,树的深度可能不止一个层次,因此我需要递归。
亚历山德罗·贾科普森2011年

2
@uvts_cvs:FOR /R %%d in (.) DO for %%f ...是递归的,但是要使它起作用,需要做一些事情。例如,您可能必须使用延迟扩展。SETLOCAL ENABLEDELAYEDEXPANSION!varname!
已暂停,直至另行通知。

%〜dpnf将忽略文件扩展名。
dolmen

@dolmen:修正了拼写错误。
暂停,直到另行通知。

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是获得绝对文件名而不带引号所需的标志(因此,可以在需要时加上引号)。但是由于它与您选择的变量名冲突,因此您必须使用另一个变量名:

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

那是完全不对的。没有变量名冲突,并且引号由您显示的命令打印出来。
暂停,直到另行通知。

0

谢谢,丹尼斯!我也在研究一个几乎相同的问题。我想要一个bat文件,我可以将其作为输入文件名的搜索字符串传入输入参数中-递归地通过目录。以防万一这对其他人有用。

::+++++++++
@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.