cmd.exe,嵌套 for 循环,变量不能在 skip= 等选项中使用

cmd.exe,嵌套 for 循环,变量不能在 skip= 等选项中使用

我有许多存档文件夹用于存储备份文件。每个文件夹每天都在增加。

我需要删除所有文件,除了每个文件中的最近 N 个副本,N 由父循环中的变量定义。

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

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

错误报告

%a” 此时是出乎意料的。

如何解决这个问题?

答案1

由于无法使用变量skip,因此您需要以某种方式解决该限制。

一些替代方案:

  1. 硬编码(要保留的副本数)通过将实际值放入 for 循环中
  2. 不要使用内联dir命令来生成条目列表,而是实现另一个脚本,该脚本仅输出您要删除的条目(然后您可能能够设置您的仅在一个地方)
  3. 将输出通过管道dir传输到实用程序,以过滤掉从列表开头开始的行(我不知道这样的情况,但可能一些 GNU 实用程序 - 其中存在 Windows 端口 - 可以做到这一点)。

答案2

您可以在循环的参数部分使用变量for,但不能使用来自另一个循环的变量for。这里有一个小例子,它列出了目录的内容%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

答案3

这将是一个用 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 会生成一个非常干净且易于维护的脚本。

在将文件运行于您的档案之前,请先进行测试,因为我没有进行太多测试。-WhatIf准备好后,请将其删除。

相关内容