#はじめに
おつかれ様です! コマンドプロンプト(cmd.exe) Advent Calendar 2015 19日目の記事を投稿します。
★ 18日目は @kunst1080 さんの "BATファイルでUCaseとLCase" でした。いつの間にか記事がすり替わってる!
★ 20日目も @kunst1080 さんで "BATファイルで、ロックファイルを使った排他制御を行う" です。
#ほったん
バッチファイルを書いてると、よくこんな感じの記述になってつらみ
@echo off
echo call job1.bat a b c >> job.log
call job1.bat a b c >> job.log
echo call job2.bat d e f >> job.log
call job2.bat d e f >> job.log
echo call job3.bat g h i >> job.log
call job3.bat g h i >> job.log
UNIXには teeコマンドとかあっていいな、コマンドプロンプトでも teeがしたい!
けど teeコマンド使っても、まだ結構面倒な気がするな。。。よし俺々コマンド作ろう!!
#じゅんび
https://github.com/nmrmsys/toe からリポジトリをクローンして、コマンドプロンプトでそのフォルダに移動
※フォルダを開いたエクスプローラーのアドレスバーで cmdとか打つと簡単に準備ができて便利です。
#つかいかた
とりあえず、オプション無しでコマンドを実行するとヘルプが出ます。
C:\Users\nmrmsys\Desktop\toe>toe
Usage: toe [output file] / [command] or [command] | toe [output file]
Options:
-a append to output file (default)
-o overwrite output file
-t adding timestamp prefi
基本的な使い方は、コマンドの後に出力ファイル名、/ で区切って、実行するコマンドを指定します。
C:\Users\nmrmsys\Desktop\toe>toe test.log / test.bat -foo /bar baz
>test.bat -foo /bar baz
test1 test1 test1
test2 test2 test2
test3 test3 test3
実行したコマンドラインと実行結果が、画面と指定したファイルに出力されます。
C:\Users\nmrmsys\Desktop\toe>type test.log
>test.bat -foo /bar baz
test1 test1 test1
test2 test2 test2
test3 test3 test3
tee とは逆で、追記モードがデフォルトなので、連続実行すると、こうなります。
C:\Users\nmrmsys\Desktop\toe>toe test.log / test.bat a b c
>test.bat a b c
test1 test1 test1
test2 test2 test2
test3 test3 test3
C:\Users\nmrmsys\Desktop\toe>type test.log
>test.bat -foo /bar baz
test1 test1 test1
test2 test2 test2
test3 test3 test3
>test.bat a b c
test1 test1 test1
test2 test2 test2
test3 test3 test3
コマンド実行時の終了コードを、toeコマンドで返すようにしているので、エラー処理等も可能です。
C:\Users\nmrmsys\Desktop\toe>type test.bat
@echo off
echo test1 test1 test1
echo test2 test2 test2
echo test3 test3 test3
exit /b 999
C:\Users\nmrmsys\Desktop\toe>toe test.log / test.bat
>test.bat
test1 test1 test1
test2 test2 test2
test3 test3 test3
>echo %ERRORLEVEL%
999
#おうよう
-t オプションを指定すると、実行結果の前後に開始・終了日時も出力します。
C:\Users\nmrmsys\Desktop\toe>toe -t test.log / test.bat
START: 2015/12/19 00:00:00
>test.bat
test1 test1 test1
test2 test2 test2
test3 test3 test3
END: 2015/12/19 00:00:00
コマンドをダブルクォートでくくると、パイプリダイレクトも使えます。
C:\Users\nmrmsys\Desktop\toe>toe test.log / "test.bat | sort /r"
>test.bat | sort /r
test3 test3 test3
test2 test2 test2
test1 test1 test1
C:\Users\nmrmsys\Desktop\toe>echo %ERRORLEVEL%
0
しかし現状、何故かコマンド実行時の終了コードが正常に取得出来ない。。。
bashの $PIPESTATUS みたく、終了コードの取得方法が異なってる、もしくは取れないとか?
あと一応、下記のように指定すれば teeと同様に実行できるようにもしてます。まあ基本使わないけど
C:\Users\nmrmsys\Desktop\toe>test.bat -foo /bar baz | toe test.log
test1 test1 test1
test2 test2 test2
test3 test3 test3
#さんこう
- Tee.VBS 標準入力を標準出力と指定ファイルまたは標準エラーに複写するVBScript
- Tee.CMD 標準入力を標準出力とファイル/標準エラーに複写するバッチファイル
- javascriptで日付フォーマッタ
#おしまい
スクリプトのTODOに書いてますが、toe test.log / cmd とかすると、固まるので
それは何とかしたい所ですが、果たして出来るのか?
コマンドプロンプトAdventといいつつ、ソースが全篇JScriptなのはどーなんだと多少思ったりもしたけれど
VSCodeの JavaScriptモードを使ってコーディングしてたら、めちゃ快適だったので、これでいいのだと納得
コマンドプロンプト芸とは、枯れた技術の総合火力演習、闇を切り裂く刹那の煌き、全てを終焉へと導く力
それではお先にしつれいします!