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ユーティリティにパイプして、いいえリストの先頭からの行 (私はそのようなことは知りませんが、Windows ポートが存在する GNU ユーティリティの一部ではそれが可能である可能性があります)。

答え2

ループのパラメータ部分では変数を使用できますforが、別のループの変数は使用できませんfor。以下に、ディレクトリの内容を%TEMP%10 回リストし、ループのたびに 1 行ずつスキップする、少し不自然な例を示します。これは、実行しようとしていることの代表的な例です。

@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準備ができたら削除してください。

関連情報