for /f forfiles 批处理中的空格不起作用

spaces in for /f forfiles batch not working

我正在尝试制作一个自动删除旧文件的脚本,这是我到目前为止想出的。

首先,我为用户主目录创建了一个输入文件。

命令:

dir downloads /s /b echo > input.txt

它像这样填充 .txt 文件:

F:\HomeDirs\a.Durge\Mijn Documenten\Downloads
F:\HomeDirs\a.eimers\Mijn Documenten\Downloads
F:\HomeDirs\a.eimers\system\Downloads
F:\HomeDirs\a.gacem\system\Downloads

输入文件填满后,我希望将其作为输入,以删除名为下载的文件夹中超过 30 天的文件

FOR /f %%G in (input.txt) DO forfiles /p %%G /C "cmd /c del %%G\*.* /q" /D -30

这在一定程度上起作用,包含空格的文件路径不受影响。

我尝试在路径周围添加引号,但我觉得我在某个地方搞砸了。

这是批处理给我的错误:

D:\Scripts>forfiles /p "F:\HomeDirs\a.Durge\Mijn /C "cmd /c del "F:\HomeDirs\a.Durge\Mijn\*.* /q" /D -30
ERROR: Invalid argument/option - 'F:\HomeDirs\a.Durge\Mijn\*.* /q'.
Type "FORFILES /?" for usage.

不包含空格的文件路径被正确处理。

我该如何解决这个问题?

在 %%G 周围加上引号。

FOR /f %%G in (input.txt) DO forfiles /p "%%G" /C "cmd /c del %%G\*.* /q" /D -30

将 "tokens=*" 放入 "for /f"

 For /f "tokens=*" 

所以你得到整行,而不仅仅是第一个 "token" 到 space

您的 for /f 命令使用 space 作为分隔符(spacetab 是默认分隔符)。

所以F:\HomeDirs\a.Durge\Mijn Documenten\Downloads将return两个令牌。

F:\HomeDirs\a.Durge\Mijn 
Documenten\Downloads

要阻止这种情况发生,请在您的命令中添加 "delims="(完全不使用定界符):

FOR /f "delims=" %%G in (input.txt) DO forfiles /p %%G /C "cmd /c del %%G\*.* /q" /D -30

你可以通过使用不同类型的 for 来进一步简化事情,它循环针对另一个命令的输出(消除对中间文件的需要),将两个命令组合在一行中:

FOR /f "delims=" %%G in ('dir downloads /s /b') DO forfiles /p %%G /C "cmd /c del %%G\*.* /q" /D -30

有关详细信息,请参阅 FOR /F Loop command: against the results of another command.