web-dev-qa-db-ja.com

FORFILESを使用して2日より古いフォルダーを削除する

これが私がやろうとしていることです:

。cmdスクリプトでforfilesコマンドを使用して、eより古い指定されたパスからフォルダーを削除します。 g。 win7マシンで2日間。

編集:状況はパスXの下で次のとおりです:\ backupsは毎日のバックアップを含むフォルダですe。 g。 2014年6月25日次のフォルダ2014年6月24日など。

これに関する私の質問は今です:

  • / dは、常に--files--を強調するヘルプです。したがって、これがフォルダでも機能するかどうかはわかりません。
  • 特に/ sと組み合わせて何をするのかわかりません。したがって、フォルダを実行してファイルを削除するだけですが、すでに親フォルダが古すぎる場合はどうでしょうか。ちなみに、再帰の概念全体は私には明確ではなく、それが何を意味するのかを知ることができませんでした。それは単にフォルダを通過することを意味しますよね?
  • IFステートメントを使用する場合は、2つの変数@ISDIRと@FDATEを使用する必要があります。このソリューションでは、forfilesコマンドで2つのIfステートメントを組み合わせる方法がわかりません。さらに、@ FDATEが再びファイル専用であり、フォルダー用ではないかどうかもわかりません。

それで、それを正しく行う方法は?

Forfilesの参照: http://technet.Microsoft.com/de-de/library/cc753551%28v=ws.10%29.aspx

ご挨拶!

1
user54512

解決

その名前にもかかわらず、forfilesコマンドは両方のファイルフォルダーとフォルダーを処理できます。これがその仕事をするバッチスクリプトです:

@echo off
setlocal

set target=X:\backups
set days=-2

for /f "usebackq delims=" %%G in (
`forfiles /p "%target%" /c "cmd /c if /i @isdir == true echo @path" /d %days% 2^>nul`
) do echo rd /s /q "%%~G"

pause
endlocal & exit /b

使い方

まず、target変数とdays変数が初期化されます。最初のものはスキャンしたいフォルダに設定され、後者は日数です。負の値は、古いか等しいを意味します。

次に、以前に設定したフォルダーと日数を指定して、forfilesコマンドを実行します。結果ごとに、特別な@isdir変数がチェックされます:値がtrueの場合、現在のエントリはフォルダであり、その@pathがエコーされます。次に、コマンド出力が解析され、一致するすべてのフォルダーが取得され、それらが削除されます。安全上の理由から、追加のechoコマンドがあり、適切なフォルダーが削除されているかどうかを確認できます。

再帰スイッチを使用する場合(/s)、すべてのファイル、フォルダー、およびそれらのサブフォルダーが処理されます。この場合、あなたはしたくありません。そうしないと、新しいフォルダに含まれている古いサブフォルダが削除されてしまう可能性がありますが、まったく触れないでください。

参考文献

6
and31415

これが1行のPowerShellアプローチです。

get-childitem "x:\backups" |? {$_.psiscontainer -and $_.lastwritetime -le (get-date).adddays(-2)} |% {remove-item $_ -force -whatif}

Adddays 'パラメーターを使用して年齢のしきい値を調整できます。これはまだ「WhatIf」モードなので、最初にテストして何が起こるかを確認できます。 -whatifを削除して、実際にフォルダーを削除するようにします。

出典: TechNetフォーラム

0
TheUser1024