2012-04-05

バッチファイル入門

GUI に慣れてるととっつきにくいコマンドライン。
しかし、世の中には CUI しかないアプリケーションもあります。

毎回コマンドプロンプトから入力するのは大変ですが、
バッチファイルを作っておくとダブルクリックで実行できて便利。

今回は rtmpdump のバッチファイルを例に解説します。
::rtmpdump.bat

set rtmpdump="..\rtmpdump.exe"

%rtmpdump%^
 --rtmp     "rtmp://"^
 --tcUrl    ""^
 --app      ""^
 --playpath ""^
 --swfVfy   "http://"^
 --pageUrl  "http://"^
 --flashVer ""^
 --flv      ""


pause
exit


最初の行から解説していきますね。
::rtmpdump.bat

rem rtmpdump.bat
最初はコメント行です。
正式には rem のあとにコメントを書きます。

: はラベルの表記なのですが
:: はコメントの簡略表記として使われてるようです。
set rtmpdump="..\rtmpdump.exe"

%rtmpdump%^
次は変数 rtmpdump に値として rtmpdump.exe のパスをセットしてます。
フルパスでもバッチファイルからの相対パスでもOKです。

変数をコマンドとして展開する場合、スペースで区切られるので
パス名にスペースを含むときはダブルクォートで囲みましょう。

次に %rtmpdump% のように変数名を % で囲むと値が展開されます。

さて、rtmpdump にはこのあとオプションをいくつか渡す必要があります。
すると一行がえらく長くなって見づらいし、修正もしにくいので複数行に分けます。
単純に改行するとコマンドとして途切れてしまうので
改行を ^ (キャレット)でキャンセルします。
 --rtmp     "rtmp://"^
 --tcUrl    ""^
 --app      ""^
 --playpath ""^
 --swfVfy   "http://"^
 --pageUrl  "http://"^
 --flashVer ""^
 --flv      ""
先ほどの ^ (キャレット)を使ってオプションをこんな感じで書けます。
一行に書くより遙かに見やすいですね。

ここでも引数にスペースを含まない限り、 ダブルクォートで囲む必要はありませんが念のため囲ってます。

rtmpdump のオプションについてはドキュメントを読んでください。
pause
exit
ここはある意味肝です。

普通にバッチファイルをダブルクリックすると 実行後にコマンドプロンプトが閉じてしまうので
エラーが起きたのか成功したのかすら分かりません。
そこで、 pause を入れることで勝手に閉じるのを防げます。

exit はなくてもいいのですが、ここで終了するので このあとにコメントやメモを書いておけます。
オプションやヘルプなんかを貼っておくと便利ですね。

ここまで説明してなんですが、rtmpdump で検索して来たあなた。
RTMPExplorer を使った方が簡単ですよ。

@echo off
@echo off と書くと以後のコマンド入力が表示されなくなります。
出力だけ見たいときに書いておくとスッキリします。
rtmpdump のバッチでは変数展開をチェックしたいので書いてませんけど。
%rtmpdump%^
 -オプション^
 > output.txt 2>&1
出力を保存したいときはこんな感じでリダイレクトを使って、テキストファイルに書き出します。
リダイレクトの詳細は以下を参照してください。
コマンド リダイレクト演算子を使用する - microsoft


バッチパラメータ

バッチファイルは引数を使うことも出来ます。
%0 はバッチファイル名、%1 ~ %9 は引数で置換されます。

ドラッグアンドドロップしたファイル名は %1 になります。
@echo off
echo %1

pause
上のコードを C:\test.bat と保存してコマンドプロンプトから使う例です。
組み込みの環境変数 %date% を引数として渡してます。
C:\test.bat %date%

また、 %~(修飾子)(引数番号) とすると、ファイル名の一部を取り出したりできます。
@echo off

echo ファイル名
echo %~0
echo フルパス名
echo %~f0
echo ドライブ名
echo %~d0
echo パス名のみ
echo %~p0
echo ファイル名のみ
echo %~n0
echo 拡張子のみ
echo %~x0
echo ショートネーム
echo %~s0
echo ファイル属性
echo %~a0
echo ファイル日付
echo %~t0
echo ファイルサイズ
echo %~z0
echo.
echo ドライブ名 + パス名
echo %~dp0
echo ファイル名 + 拡張子
echo %~nx0
echo.

pause


日付・時間を使う

ファイル名などに日付・時間を入れたいこともありますね。
そんなときは、組み込みの環境変数 date、time を使います。

::datetime.bat
@echo off

echo 今日の日付
echo %date%
:: 2012/01/01

echo 現在時刻
echo %time%
:: 12:00:00.00

pause

ここで問題なのは / (スラッシュ)、 : (コロン) はファイル名に使えないことです。
要らないものは置換してしまいましょう。

書式は %変数名:置換対象文字列=置換後文字列% となります。
echo %date:/=%
:: 20120101

echo %time::=%
:: 120000.00

echo %date:/=%_%time::=%
:: 20120101_120000.00

このままで用が足りる場合もあるでしょうが、
細かく整形したい場合は抽出しちゃいましょう。

書式は %変数名:~m,n% (m,nは数字)となります。
m 文字目から n 文字を抽出します。
1番目の文字を 0 として数えることに注意。
m がマイナスの場合は、後ろから数えます。
set dt=%date%
set yyyy=%dt:~-10,4%
set mm=%dt:~-5,2%
set dd=%dt:~-2,2%

set date2=%yyyy%-%mm%-%dd%
echo %date2%
:: 2012-01-01

set tm=%time: =0%
set hh=%tm:~0,2%
set mm=%tm:~3,2%
set ss=%tm:~6,2%

set time2=%hh%-%mm%-%ss%
echo %time2%
:: 12-00-00

echo %date2%_%time2%
:: 2012-01-01_12-00-00

これで好きなように整形できますね。

補足しておくと、Windows2000では日付が
日 2012/01/01
のように曜日が頭に付くので、後ろから数えてます。

また、時間が1桁の場合
 1:00:00.00
のように頭にスペースが付くので 0 に置換します。


短く書きたい場合は
:: yyyy-mm-dd
echo %date:~-10,4%-%date:~-5,2%-%date:~-2,2%

:: Windows2000を考慮しない場合
echo %date:~0,4%-%date:~5,2%-%date:~8,2%

:: hh-mm-ss
set time2=%time: =0%
echo %time2:~0,2%-%time2:~3,2%-%time2:~6,2%



入門編としてはこれぐらい押さえておけばいいでしょう。
制御文やループを使いたいという方は参考サイトをどうぞ。


- 参考サイト -

コマンドライン リファレンス - microsoft
Windowsコマンドプロンプト基礎文法最速マスター - CX's Memo
バッチファイル基礎文法リファレンス - 学習ノート
連載:Windows 2000コマンドライン徹底活用 - @IT
バッチ・ファイル中で日付をファイル名に使用する - @IT

0 コメント:

コメントを投稿