おはようございます くろねこです。
バッチ特集の2回目の投稿となります。
繰り返しになりますが、この特集のコンセプトです。
■ コンセプト ■
だから、とうすればいいの!
講釈なんかどうでもいいんだよ!
よくわかんなくても、貼り付ければ使える
こんな感じで行きますので、よろしくお願いします。
途中、【講釈】と記載しているところは、時間のある時に読んでもらえれば、okです。
本特集を最初からご覧いただく場合は下記の記事をご覧ください。
それでは、第2回のスタートです。
Windowsの日付と時刻のデータ形式 (講釈)
バッチを作成する場合に、日付や時刻を扱うことがあると思います。
具体的には、日付や時刻をファイル名に含んでみたり です。
その際に、参照する日付や時刻の提供形式がどうなっているのかを知る必要があります。
確認方法は、コマンドプロンプトで以下のコマンドを実行することで簡単に確認できます。
注意が必要なのは、午前0時から9時台です。
以下の画像を見ればわかりますが、
「時」が一桁(午前0時から9時台)の場合、半角スペースが入ることです。
前ゼロをつけてくれればいいのにと個人的には思います。
まあ、コロン(":")の位置が変化しないから、まだマシですね。
便利な小技
文字列の一部を取り出す
目的
変数に格納された文字列の一部を参照する。
記述方法
%変数[:~[m][,n]]%
[ ]で囲まれた部分は省略可能な部分です。
解説【講釈】
m : 取り出したい文字の先頭からのオフセット文字数を表します。変数の先頭文字は0になります。省略時は0が指定されたものと認識します。(ですが、省略はお勧めしません)
n : 取り出したい文字数を指定します。省略した場合は末尾までの文字列をすべて取り出します。文字列より長い文字数を指定した場合は文字列の末尾までの参照となります。
具体的な例で説明したほうが早そうなので下記をご覧ください。
変数 TEXTWORK の内容は "abcd1234" を前提とします。
オフセット2(3文字目)から4文字の参照
%TEXTWORK:~2,4% → "cd12"
オフセット0(1文字目)から2文字の参照
%TEXTWORK:~0,2% → "ab"
オフセット5(6文字目)以降の文字列の参照
%TEXTWORK:~5% → "234"
オフセット0(1文字目)から3文字の参照(オフセットの省略)
%TEXTWORK:~,3% → "abc"
オフセット0(1文字目)から10文字の参照(文字列の長さよりも長い文字列の参照)
%TEXTWORK:~0,10% → "abcd1234"
(応用)日付、時刻の文字列参照
目的
ファイル名に日付や時刻を含めたい場合の参照方法です。
記述方法
yyyymmdd-hhmmss.txt のファイル名の場合、以下のコードで実現できます。
set @WORKDATE=%date% set @WORKTIME=%time% if "%@WORKTIME:~0,1%"==" " ( set @WORKTIME=0%@WORKTIME:~1% ) set @FILENAME=%@WORKDATE:~0,4%%@WORKDATE:~5,2%%@WORKDATE:~8,2% set @FILENAME=%@FILENAME%-%@WORKTIME:~0,2%%@WORKTIME:~3,2%%@WORKTIME:~6,2% set @FILENAME=%@FILENAME%.txt echo ファイル名は %@FILENAME% です。
解説【講釈】
この記述例では、午前0時~9時台の考慮をするため、日付と時刻をいったん作業用の変数(@WORKDATE、@WORKTIME)に格納し、その作業用変数を以降参照してファイル名を生成します。
最終的に、変数 @FILENAME にファイル名が格納されます。
(途中、if文 が出てきますが、本記事のこの後に説明があります。)
判定分(if文)
目的
変数の値やファイルの状態などを確認し条件分岐する。
条件を満たす場合と満たさない場合の処理を記述することができる。
記述方法
if [not] 条件式 (
条件を満たす場合の処理 (then節)
・・・
) else (
条件を満たさない場合の処理 (else節)
・・・
)
then節が一文のみの場合、( )は不要である。
if [not] 条件式 条件を満たす場合の処理 (then節)
[ ]で囲まれた部分は省略可能な部分です。
解説【講釈】
一般的なプログラム言語の if文 と認識してよいものである。
条件式は、値の判定のほか、ファイルやフォルダの有無の確認、エラーコード判定なども書けます。(当記事のこの後、触れさせていただきます。)
個人的な意見ですが、
then節、else節の両方を記述する場合、所謂、正常系と呼ばれる側の処理を記述したほうが、後々、見やすいものになります。
文字列の比較
目的
文字列を比較する。
記述方法
if [not] 変数==値
[ ]で囲まれた部分は省略可能な部分です。
くろねこの場合、空文字列やスペースの判定するする場合、明確に空文字列やスペースであることを表現するために以下の書き方をしています。
空文字列判定
if [not] "変数"==""
半角スペース判定
if [not] "変数"==" "
必要に応じてご利用ください。
基本的にバッチの世界では、変数の型(文字型や数値型など)が無いので、変数や値の比較がおおむね文字列の比較と考えたほうがよさそうです。
また、高度な比較演算は非常に分かりにくく事故を招きやすいので、シンプルな流れを構築するよう考えてください。
ファイルやフォルダの有無の確認 (if exist)
目的
フォルダやファイルの存在を確認する。
記述方法
if [not] exist { ファイル名 | フォルダ名 }
[ ]で囲まれた部分は省略可能な部分です。
{ }で囲まれた部分は択一選択の記述項目(区切りは"|")です。
解説【講釈】
指定したファイル名(またはフォルダ名)が存在するか(存在しないか)を確認する。
具体例を示します。
(e.g) ファイル c:\work\system.log が存在する場合はファイルを削除する。
set @FILENAME=c:\work\system.log if exist %@FILENAME% del %@FILENAME%
(e.g) フォルダ .\log が存在しない場合はフォルダを作成する。
set @FOLDERNAME=.\log if not exist %@FOLDERNAME% md %@FOLDERNAME%
エラーコードの判定 (if errorlevel)
目的
直前で実行したコマンドの実行結果(エラーコード)を判断する。
記述方法
if [not] errorlevel 比較エラーコード
{ }で囲まれた部分は択一選択の記述項目(区切りは"|")です。
解説【講釈】
直前に実行したコマンドの実行結果(エラーコード)が、比較エラーコード以上である場合に条件が成立する。
具体例を示します。
(e.g) プログラム sample.exe は正常終了した場合、終了コードは 0 となる。エラーが発生した場合、終了コードは 8 となる。
set @PGM=sample.exe %@PGM% if errorlevel 8 echo エラーが発生しました
終わりに
やはり、全体的に「講釈づいて」しまいます。すみません。
さて、バッチのほんのさわり部分を2回にわたって投稿させていただきました。
そろそろ、次回くらいに実践的なものをやりたいと思います。
それでは、また。
お時間のある方は、こちらの記事もご覧ください。