在 Windows 中,具有递归 for 循环且文件名包含空格的批处理文件

在 Windows 中,具有递归 for 循环且文件名包含空格的批处理文件

我有一个文件夹树,像这样(这只是一个例子,在我的实际情况中它会更深):

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"

答案1

这个怎么样?

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

答案2

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

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

您可能能够执行嵌套FOR语句。外部语句将遍历目录树,内部语句将是上面的目录树。

答案3

您可能需要查看 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"

答案4

谢谢,丹尼斯!我也在处理一个几乎相同的问题。我想要一个 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

相关内容