LoginSignup
3
5

More than 5 years have passed since last update.

WindowsのForfilesコマンドで、特定のファイル名以外を操作する方法

Last updated at Posted at 2017-11-13

経緯

自社で使っているサーバに保管されている一時ファイルが肥大化したため、一定日数以上、経過したファイルを削除しようと思いました。
ただ、そのフォルダの中には削除してはいけないファイルも入っており、これ以外を削除する必要がありました。

ハマった例

前提

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件は、非常に勉強になりました。

引用元

自分の質問

ありがとうございました。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5