我有一个文件夹树,像这样(这只是一个例子,在我的实际情况中它会更深):
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