我有许多存档文件夹用于存储备份文件。每个文件夹每天都在增加。
我需要删除所有文件,除了每个文件中的最近 N 个副本,N 由父循环中的变量定义。
%%a 是父循环中的一个数字,然后使用另一个 for 循环删除
for /F "usebackq skip=%%a" %%x in (`dir /TW /O:-D /B %%b`) do del %%x
错误报告
%a” 此时是出乎意料的。
如何解决这个问题?
答案1
由于无法使用变量skip
,因此您需要以某种方式解决该限制。
一些替代方案:
- 硬编码否(要保留的副本数)通过将实际值放入 for 循环中
- 不要使用内联
dir
命令来生成条目列表,而是实现另一个脚本,该脚本仅输出您要删除的条目(然后您可能能够设置您的否仅在一个地方) - 将输出通过管道
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
准备好后,请将其删除。