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準備好後將其刪除。

相關內容