質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

9667閲覧

forfilesの期間指定って可能ですか?

hyksm

総合スコア174

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2016/12/22 02:37

以前、こちらで
forfilesでのPDF圧縮方法を教えて頂きました

forfiles /P C:\pdf /S /M *.pdf /D -90 /C "cmd /c gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=@path_2.pdf @path"

90日以前のpdfファイルを圧縮するバッチコマンドです

上記、うまくいったのですが実際に実行しようとするとファイル数が多くて
躊躇してます。

そこで90日以前の指定から30日前から60日の間のpdf
のように期間指定出来ないかと思ってます

方法をご存知の方、いらっしゃいましたら教えていただけないでしょうか?

forfilesでの期間指定方法を

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2016/12/22 03:11

自分では何をしてどうなりましたか?
hyksm

2016/12/22 03:53

いろいろ調べてみたのですが/D -90の様に何日まえなどの日付指定はありますが、いつからいつまでのファイルを対象とするような期間指定は見つけられませんでした。。。。。
guest

回答1

0

ベストアンサー

質問にストレートに答えると、上限下限を指定しての期間指定は出来ません。
forfiles /?を参照してください。また、実際に、/Dを2回指定するとエラーになります。やってみましたか?

30日以前と90日以前のファイルリストを作って、その差分に対して、処理を実行するというバッチスクリプトを書くことになるかと思います。

バッチファイルの例:
・30日以前89日未満のファイルのみ対象とする。
・90日以前のリスト、30日以前のリストを作り、30日以前のリストにはあるが、90日以前のリストにないものを調べる。

DOS

1forfiles /P C:\pdf /S /M *.pdf /D -90 /c "cmd /c echo @path"> OLD90 2forfiles /P C:\pdf /S /M *.pdf /D -30 /c "cmd /c echo @path"> OLD30 3for /f "delims=" %%A in (OLD30) do ( 4 findstr %%A OLD90 >NUL 5 if errorlevel 1 gswin64c ~~~ %%A 6) 7del OLD30 OLD90

投稿2016/12/22 06:27

編集2016/12/22 23:27
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyksm

2016/12/22 08:47

上記for文はパスの指定などは必要無いですか? C:\pdfの中で90日以前のリストと、30日以前にリストを作成するまではわかるのですが for コマンドもC:\pdfに対しておこなわれるのでしょうか?
hyksm

2016/12/26 06:19

やはりfor文はカレントに対して行われますね。 なので forfiles /P C:\pdf /S /M *.pdf /D -90 > C:\pdf\OLD90 forfiles /P C:\pdf /S /M *.pdf /D -30 > C:\pdf\OLD30 //圧縮は別名保存が必要なので for /f "delims=" %%A in (C:\pdf\OLD30) do ( findstr %%A C:\pdf\OLD90 >NUL if errorlevel 1 gswin64c ~~~ C:\pdf\%%A\%%~nA.pdf.pdf C:\pdf\%%A\%%~nA.pdf ) //圧縮前の*.pdfを削除 for /f "delims=" %%A in (C:\pdf\OLD30) do ( findstr %%A C:\pdf\OLD90 >NUL if errorlevel 1 del /s C:\pdf\%%~nA\%%~nA.pdf ) //圧縮後の*.pdf.pdfをリネームし*.pdfに del C:\pdf\OLD30 C:\pdf\OLD90 としましたが如何でしょう
otn

2016/12/26 06:46

最初の版ではファイルに記録するのが、フルパスじゃなかったので、/c "cmd /c echo @path" にこっそり修正してありました。 該当ファイルがあった時に、複数の処理をしたいのなら、こうですね。 エラーはありえないのかも知れませんが、念のため、gswin64cの成功を確認してから、削除とリネームを行います。 ( if not errorlevel 1 が成功という意味) findstrのつぎで、 if errorlevel 1 ( gswin64c ~~~ C:\pdf\%%A\%%~nA.pdf.pdf C:\pdf\%%A\%%~nA.pdf if not errorlevel 1 ( del C:\pdf\%%A\%%~nA.pdf ren C:\pdf\%%A\%%~nA.pdf.pdf %%~nA.pdf ) )
hyksm

2016/12/26 07:00

こんな風にかけるんですね。テストしてみます。 ありがとうございます。
hyksm

2016/12/26 23:58

テストしましたがコマンド落ちますね。if errorlevel 1 の中にif not errorlevel 1()を書いても問題ないんですか? if errorlevel 1 (hoge  if not errorlevel 1 (   hoge1   hoge2  ) )
hyksm

2016/12/27 00:22

>30日以前のリストを作り、30日以前のリストにはあるが、90日以前のリストにないものを調べる。 という部分がうまく処理されませんでした。 時間かかるなあと思って見てみたら、30日以前のリストを全て対象として処理していました。 なぜでしょうか?
otn

2016/12/27 00:49

コードを全部書いてください。
hyksm

2016/12/27 02:29

findstrをfind /Cに変えたら差分は取得出来ました。
hyksm

2016/12/27 02:38

バッチファイルはC:\に置いてある rem echo 30日以前の確認用pdfを自動圧縮する(圧縮されたものは日付は当日に更新される) forfiles /P D:\pdf /S /M *.pdf /D -90 /c "cmd /c echo @path" > D:\pdf\OLD90 forfiles /P D:\pdf /S /M *.pdf /D -30 /c "cmd /c echo @path" > D:\pdf\OLD30 //D:\pdfに移動 pushd D:\pdf for /f "delims=" %%A in (OLD30) do (  //OLD90にないもの取得 find /C %%A OLD90 > NUL if errorlevel 1 (gswin64c -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=%%~A.pdf %%~A if not errorlevel 1 ( del /s %%~A ren %%~A.pdf %%~nA.pdf ) ) ) del OLD30 OLD90 //戻る popd exit これで何とかうまく行きました
otn

2016/12/27 03:21

> findstrをfind /Cに変えたら差分は取得出来ました。 そうか、フルパス名に空白があったんですね。「findstr /c に変えた」の間違いでは?
hyksm

2016/12/27 03:46

いや、フルパス名に空白はありません。find /Cで間違いないです。 findstr /cでもいけるんですかね。機会あればトライしてみます。 いろいろありがとうございました。
hyksm

2016/12/27 03:48

findstr /cは無視されました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問