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

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

新規登録して質問してみよう
ただいま回答率
85.34%
バッチファイル

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

Q&A

解決済

1回答

228閲覧

バッチファイルの実行をタスクスケジューラ化、実行結果を常に正常と表現したい

saya24

総合スコア249

バッチファイル

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

0グッド

0クリップ

投稿2024/12/26 07:43

編集2024/12/26 07:45

実現したいこと

標準出力、標準エラー出力の原理もよく分かっていない身ですが 教えて頂けますでしょうか?

クラウドのシステムから 定刻で自動受信するファイルを社内で処理して所定フォルダへ保管する機能を運用中です。
所定フォルダに保管されるファイル名は 可変で何もしなければ蓄積される一方ですから、一定期間を経た退役ファイルを 自動削除していこうと考えだしています。

こちらの実現は この記事を参考に 実装しようと考えています。

BATCH

1@echo off 2forfiles /p "C:\YourFolder" /s /m *.* /d -30 /c "cmd /c del /q @path"

発生している問題・分からないこと

試しに、仕上がったバッチファイルを タスクスケジューラで起動したら 恐らくに削除対象がないという理由だけで、タスクスケジューラで 異常終了の記録がなされているようでした。

タスクスケジューラ

質問
当該パッチファイルの処理結果を 常に正常であったように タスクスケジューラに記録するには どういった手続きを踏めばよいのでしょうか?

今更な内容かもしれませんが ご教示をよろしくお願いします。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

標準出力と標準エラー出力を バッチファイル内での使い分け方がわかっていないだけでく、
そもそも タスクスケジューラに現れている実行結果が 何をもとに表示されているのかわかっていない=調べる対象が今一つ曖昧のため問合せさせて頂きました。

補足

特になし

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

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

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

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

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

meg_

2024/12/26 09:39

> 試しに、仕上がったバッチファイルを タスクスケジューラで起動したら 恐らくに削除対象がないという理由だけで、タスクスケジューラで 異常終了の記録がなされているようでした。 テスト時にはちゃんと動いたけれども実稼働環境では「異常終了の記録がなされ」たということでしょうか?通常は正常終了しているが時々異常終了してしまうということで良いでしょうか?
saya24

2024/12/26 10:14

meg_様 ECHOとPUASEいれて バッチファイル単体で確認済です。ファイルの削除対象がない場合にエラーになることを確認しました。 削除対象があると タスクスケジューラ経由の起動でも 正常終了を記録できていることも確認済です。回答になっていると幸いです。 
guest

回答1

0

ベストアンサー

タスクスケジューラーに記録されるのは、実行したコマンドの終了コードです。
終了コード0が正常で、0以外が異常終了という扱い。
(エラーメッセージが表示されるかどうかと、終了コードが0かどうかは、直接の関係はありません。独立の事象です)

バッチファイルの終了コードは、「最後に実行したコマンドの終了コード」です。
(ただし、echo等一部の組み込みコマンドが最後だと、その前のコマンドの終了コードです)
お書きの場合は、最後のコマンドはforfilesですが、このコマンドは該当無しだと終了コードが1です。
exit /b 0という「終了コード0で、そのバッチファイルを(まだ後ろに何か書いてあっても)終了する」というコマンドがあるので、それを次の行に書くと良いでしょう。

CMD

1@echo off 2forfiles /p "C:\YourFolder" /s /m *.* /d -30 /c "cmd /c del /q @path" >C:\LOGLOG\LOGFILE.TXT 2>&1 3exit /b 0

2行目に追加したのは、forfilesのメッセージをファイルに書くということなので、メッセージの確認が不要なら元のままでいいです。
また、/m *.*は、「すべてのファイル名のファイルを対象にするのではなくて、ピリオドを1つ以上ファイル名に含んだものだけを対象にする」という意味なので、「すべてのファイル名のファイルを対象にする」という意図ならこの部分まるごと不要です。
さらに、/sは「C:\YourFolderの直下だけでなく子フォルダー、孫フォルダーなどのなかのファイルも対象にする」という意味なので、「所定フォルダへ保管する」のなら、おそらく不要でしょうね。

各オプションの意味は、forfiles /?で表示されます。

投稿2024/12/26 16:04

otn

総合スコア85989

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

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

saya24

2024/12/26 23:53

otnさん ご丁寧な説明ありがとうございました。終了コードの説明のみならず 一般的な対応手続き事例まで交えて頂き助かります。 起動元へ 常に正常な処理結果を伝達する上での話題に 標準出力・標準エラー出力は関係しない。 基本的に バッチファイル含め 動作するプログラムは 終了コードを標準出力するようになっているから タスクスケジューラで 処理結果が表現できるようになっている という解釈をしましたが 合っているかな??。 標準出力・標準エラー出力と 何か関係あるものと勘違いしていたので 一応おさらいさせて頂ければ幸いです、
otn

2024/12/27 16:15

①> 起動元へ 常に正常な処理結果を伝達する上での話題に 標準出力・標準エラー出力は関係しない。 いいえ。「起動元のプログラムが何を以て正常と判断するか」は、その起動元プログラム次第です。 「Windowsのタスクスケジューラーは、【前回の実行結果】欄になんと表示するかの参考に、終了コードを使っているが、標準出力・標準エラー出力は【前回の実行結果】欄には関係しない。」というだけであって、すべての起動元プログラムがそうだという事にはならないです。 回答の冒頭に書いた、 > 終了コード0が正常で、0以外が異常終了という扱い。 は「タスクスケジューラーはそう扱う」という意味で、これもケースバイケースです。 まあ、「終了コード0が正常で、0以外が異常終了という扱い」をするプログラムが多いのは確かです。 ②> 基本的に バッチファイル含め 動作するプログラムは 終了コードを標準出力するようになっているからタスクスケジューラで 処理結果が表現できるようになっている という解釈をしましたが 合っているかな??。 ①は、起動元をタスクスケジューラーに限定すれば正しいのですが、②は全く間違っています。 終了コードを「標準出力」に出力するプログラムは、作ればありますが、現実にはあまりないです。 回答に書いたとおり、「終了コード」と「標準出力」「標準エラー出力」には直接の関係はありません。 ・エラーがあれば、多くの場合は終了コードは0以外だろう ・エラーがあれば、エラーメッセージが標準エラー出力に表示されるだろう という推測は、そういうケースが多いので、的外れではないものの、必ず成り立つ物では無いし、成り立つ場合でも、両者は独立で因果関係は無いです。 例えば、 @exit /b 5 とだけ書いたバッチファイルを実行しても、「標準出力」や「標準エラー出力」に何も出力されませんが、終了コードは5です。 タスクスケジューラーからこの1行のバッチファイルを起動すると、前回の実行結果欄に、(0x5) と表示されるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問