locked
forfilesコマンド タスクスケジューラ起動にてforfilesが処理されない RRS feed

  • 質問

  • あるフォルダ配下のn日経過したフォルダを削除するため、forfilesを利用し該当のフォルダを削除する次のバッチ(バッチソース(1))を作成しています。

    ● バッチソース(1)
    cd /d %~dp0
    set logsv_dir=%1
    if "%logsv_dir%"  == "" set logsv_dir=D:\otherdrive\backup_a
    set logsv_days=%2
    if "%logsv_days%" == "" set logsv_days=30
    forfiles /p %logsv_dir% /d -%logsv_days% /c "%ComSpec% /c RMDIR /S /Q @path"

    DOS窓からの実行では、30日以前のフォルダを削除できるのですが、タスクスケジューラに登録し、実行させると該当フォルダが削除されず正常終了となります。

    調査のために、次のバッチ(バッチソース(2) RMDIRの部分を echoにしたもの)を作成し、DOS窓からの実行状態(LIST(1))と、タスクスケジューラでの実行状態(LIST(2))を出力させたところ、タスクスケジューラでの実行では、forfilesコマンド部分のECHO出力が出力されていないことがわかっています。

    ● バッチソース(2)
    cd /d %~dp0
    @echo rem1 > list.txt
    set logsv_dir=%1
    if "%logsv_dir%"  == "" set logsv_dir=D:\otherdrive\backup_a

    @echo rem2 >> list.txt
    set logsv_days=%2
    if "%logsv_days%" == "" set logsv_days=30
    @echo %logsv_dir% >> list.txt
    @echo %logsv_days% >> list.txt

    @echo rem3 >> list.txt
    forfiles /p %logsv_dir% /d -%logsv_days% /c "%ComSpec% /c echo @path" >> list.txt

    @echo rem4 >>list.txt
    exit

    ● DOS窓からの実行状態(LIST(1))
    rem1
    rem2
    D:\otherdrive\backup_a
    30
    rem3

    "D:\otherdrive\backup_a\20171010"
    "D:\otherdrive\backup_a\20171011"
    "D:\otherdrive\backup_a\20171201"
    rem4

    ● タスクスケジューラでの実行状態(LIST(2))
    rem1
    rem2
    D:\otherdrive\backup_a
    30
    rem3
    rem4

    ● タスクスケジューラの実行履歴
    タスク スケジューラは、タスク "\pauge"、インスタンス "{d9c277a0-ed36-4f44-9fd2-6f280d8b8b38}"、操作 "C:\Windows\SYSTEM32\cmd.exe" を正常に完了しました。リターン コード: 0

    タスク スケジューラは、ユーザー "xxxxxxxxxx\Administrator" の "\pauge" タスクの "{d9c277a0-ed36-4f44-9fd2-6f280d8b8b38}" インスタンスを正常に完了しました。

    ● タスクスケジューラの設定
    (全般)
    タスクの実行時に使うユーザーアカウント : Administrator
    ユーザーがログオンしているかどうかにかかわらず実行する
    最上位特権で実行する

    (トリガー)
    毎日 指定時間に実行

    対応策をご教示いただけたら幸いです。
    ご回答よろしくお願い致します。

    2018年1月14日 12:04

すべての返信

  • hh1r0 さま よろしく。

    ユーザーがログオンしているかどうかにかかわらず実行 では 環境変数は使えなかった気がしますが。

    2018年1月14日 13:01
  • ShiroYuki_Mot さま  回答ありがとうございます。

    環境変数は、forfiles /p %logsv_dir% /d -%logsv_days% /c "%ComSpec% /c echo @path" >> list.txt で使用している %ComSpec% のことでしょうか。

    この部分は、質問に入れる前は、cmd と記述しており現状のバッチと同じ結果になっておりました。
    cmd.exeのフルパスを参照させるために、あえて %ComSpec% を設定した次第です。

    2018年1月14日 14:35
  • hh1r0 さま 拝見しました。

    環境変数もサーチパスも効かなかった記憶があります。 ドライブからのフルパス記述(直書き)に変更するとどうでしょうか?。

    (サーチパスも環境変数で実現されていますから。)
    2018年1月14日 15:04
  • © ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018

    そういうときは、バッチファイルの出力1と2をテキストファイルに出す。

    タスクのファイル 
    cmd.exe

    タスクの引数 
    /c "バッチファイルパス名" >"テキストファイルのパス名" 2&>1
                                 タイポ 訂正 
    /c "バッチファイルパス名" >"テキストファイルのパス名" 2>&1

    2018年1月15日 5:12
  • ShiroYuki_Mot さま 回答ありがとうございます。

    ドライブからのフルパス記述(直書き)にする方法(以下の変更)でも、結果は同じでした。

    rem forfiles /p %logsv_dir% /d -%logsv_days% /c "cmd /c echo @path" >> list.txt
    forfiles /p D:¥otherdrive¥backup_a /d -30 /c "C:¥Windows¥system32¥cmd.exe /c echo @path" >> list.txt

    2018年1月15日 14:58
  • hh1r0 さま 拝見しました。

    ユーザーがログオンしているかどうかにかかわらず実行 ではユーザーに絡む環境変数等が使えない為、
    先の返信をしたのですが ... 。  

    残るは、後1点でしょうか。
    D:\ はネットワークドライブではないですよね。
    (その場合、UNC パスに変更して下さい。 これもユーザー絡みであった筈です。)

    違うと思うのですが、参考迄に。
    ブラウザからコピペすると区切り記号の¥が html で ¥ になっていて、これが原因で、正常動作しないケースがあります。
    この場合には、ちゃんと、\をタイプし直す事で正常化されます。 \ =¥ 半角

    2018年1月16日 1:20
  • © ウィンドウズスクリプトプログラマ - Windows Script Programmer 2018

    こういうときは、実行ログを取って、それを見るのが定石なのに。エラーが出てるかもしれないのに、なぜ見ない?
    2018年1月18日 11:50