経緯
自社で使っているサーバに保管されている一時ファイルが肥大化したため、一定日数以上、経過したファイルを削除しようと思いました。
ただ、そのフォルダの中には削除してはいけないファイルも入っており、これ以外を削除する必要がありました。
ハマった例
前提
C:\temp配下にhoge.pdfとfuga.PNGファイルが存在するとします。
共に作成日は今日から15日以上前で、想定としては、fuga.PNGのみが削除されてほしいと考えています。
実行結果
何も指定しない場合
C:\TEMP\test>FORFILES /P "C:\TEMP\test" /S /M *.* /D -15 /C "cmd /c echo del @file"
del "fuga.PNG"
del "hoge.pdf"
if @file=="hoge.pdf"
を指定した場合、何も抽出されず…
C:\TEMP\test>FORFILES /P "C:\TEMP\test" /S /M *.* /D -15 /C "cmd /c if @file=="hoge.pdf" echo del @file"
C:\TEMP\test>pause
続行するには何かキーを押してください . . .
if not @file=="hoge.pdf"
と否定の条件を指定した場合、全て抽出されるのでif自体は有効と思われます
C:\TEMP\test>FORFILES /P "C:\TEMP\test" /S /M *.* /D -15 /C "cmd /c if not @file=="hoge.pdf" echo del @file"
del "fuga.PNG"
del "hoge.pdf"
C:\TEMP\test>pause
続行するには何かキーを押してください . . .
要するに@file=="hoge.pdf"
の判定が上手くいかないがために、思った処理をすることが出来ませんでした。
解決方法
下記の様に判定対象の文字列を0x22
で囲う事で問題が解消されました。
("
を生で書いちゃうとサブシェルに渡らないそうです… )
FORFILES /P "C:\TEMP\test" /S /M *.* /D -15 /C "cmd /c if @file==0x22hoge.pdf0x22 echo del @path"
ちなみに、サブディレクトリ配下も削除する場合は、del @file
ではなくdel @path
とする必要もあるそうで。
今回の1件は、非常に勉強になりました。
引用元
ありがとうございました。