2016-09-07 8 views
2

パブリックディレクトリをパージしようとしています。そのため、30日以上経過したアイテムは削除する必要があります。私は、次のコマンドでバッチファイルのセットアップを持っています:forfilesを使用してフォルダとその内容を削除する

forfiles /p "C:\PATH\USERS\PATH\" /s /m *.* /c "cmd /c Del @path /q" /d -30 

これは素晴らしいです。ただし、問題は、パス内のフォルダ内のアイテムのみを削除することです。

例:C:\PATH\USERS\PATH\HelloWorld\file.textは30日以上経過しています。しかし、このコマンドでは、フォルダではなくfile.textが削除されます。

フォルダが空であるかどうかを確認してから別のコマンドでフォルダを削除する必要がありますか?

+2

を。あなたが '/ s/q 'を指定しない限り、emty以外のフォルダは削除されません。 – Stephan

+0

フォルダが30日前かどうかチェックしますか?もしそうなら、 '@ isdir'変数を使ってディレクトリのみをチェックし、そのディレクトリを削除してください。 – Squashman

答えて

2

使用しているコマンドラインは(私はここでそれをコピーして、スイッチを並べ替え)は非常に危険である:

forfiles /S /D -30 /P "C:\PATH\USERS\PATH\" /M "*.*" /C "cmd /C del /Q @path" 

forfilesため、戻りのファイルとディレクトリの両方。検索条件(30日前またはそれ以前の最終更新日)に一致するcontainerというディレクトリがあると仮定すると、実行されたdelコマンドラインはdel "C:\PATH\USERS\PATH\container" /Qです。すべてのファイルで、検索条件を満たしていないファイルも含まれます(del \folderは動作しますdel \folder\*のように)。

は、この問題を解決するために、あなたはこのように、ファイルやディレクトリをフィルタリングする必要があります、すべての内部コマンドではなく、ない forfilesので

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==FALSE del @path" 

は、私はまた、**.*からファイルマスクを変更しました*.*の場合は、拡張子のないファイルと一致します。さらに、末尾の\をパスから削除しました。そうしないと、forfilesはエラーを発生させます。ERROR: The directory name is invalid.


しかし、今は完全に別の何かのために - あなたの実際の質問への答え:それはそのサブアイテムを返し前forfiles /Sがディレクトリを返しますので

、それは意味がないかどうかをチェックしますかディレクトリが空であるか同じコマンドラインにない場合、後でそれを行う必要があります。そのために

、あなたはこのような二forfilesループを使用するか(あなたが好きな場合にも、彼らの最終更新日時をチェックし、そうでない場合、/D -30部分を削除):もし

forfiles /S /D -30 /P "C:\PATH\USERS\PATH" /M "*" /C "cmd /C if @isdir==TRUE rd @path 2> nul" 

または代わりに、ディレクトリの変更日は関係ありません、あなたも高速ですfor /Dループ、使用することができます。フォルダを削除するには、[RD](http://ss64.com/nt/rd.html)を使用

for /D %%I in ("C:\PATH\USERS\PATH\*") do rd "%%~fI" 2> nul 
関連する問題