cmd.exe,嵌套for循环,variables不能在像skip =这样的选项中使用

我有很多存储备份文件的存档文件夹。 每个文件夹每天增加。

我需要删除除最近N个副本以外的所有文件,N由父循环中的一个variables定义。

%% a是父循环中的一个数字,然后使用另一个for循环来删除

for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x 

错误报告

%a“在这个时候是意外的。

如何解决这个问题?

由于skip不能使用variables,因此需要以某种方式解决该限制。

一些替代品:

  1. 通过将实际值放入for循环来硬编码N (要保留的拷贝数)
  2. 而不是使用内联dir命令来生成条目列表,实现另一个只输出要删除的条目的脚本(然后,您可以在一个位置设置N
  3. dir的输出pipe道输出到一个实用程序,该实用程序从列表的开始处过滤出N行(我不知道这样做,但有些GNU实用程序(其中存在Windows端口)可能会这样做)。

你可以在for循环的参数部分使用一个variables,而不是从循环的另一个variables。 下面是一个有点人为的例子,它列出了%TEMP%目录的内容10次,每次循环跳过一行。 这应该是你想要做的一个代表性的例子:

 @echo off for /l %%a in (1,1,10) do call :innerloop %%a > %%a.txt goto :EOF :innerloop for /f "usebackq skip=%1" %%i in (`dir /s /a /b "%TEMP%"`) do echo %%i 

这将是一个很好的写在PowerShell中的脚本。

 $n = 5 $FoldersList = Dir e:\Archive foreach($Folder in $FoldersList) { Dir $Folder | Sort-Object CreationTime -Descending | Select-Object -Skip $n | Remove-Item -whatif } 

在这种情况下,Powershell使得维护脚本变得非常简单和容易。

在你的档案上运行之前testing它,因为我没有在我的最后testing它。 删除 – 什么时候你准备好了。