初めてWindowsバッチを書いた

 友人がファイル名を揃えるのに何かマクロかソフトが欲しいと言っていてWindowsのバッチでいけるんじゃね?と思って書きました。処理自体はファイルhoge.binに対してhoge_sub.binがあるか調べたり、ファイル名hogehoge.binをhogehoge_sub.binに書き換えるとかができれば良く、バッチスクリプトを今まで書いたことが無かった自分でも調べながら2-3時間で書くことができました。ただ、C言語やシェルスクリプトをちょこっと書いたことがあるのでバッチもまあ書けるっしょと思ったら意外と詰まりポイントがありました。
 今後またバッチファイルを作ることがあった時用の自分用メモです。

スペースの扱い

set var1=abc
set var2 = def
echo %var1%
echo %var2%
echo %var2 %
これを実行するとvar1には「abc」が入っているけどvar2という変数は認識されずvar2 という変数に「 def」が入ってることがわかります。(代入記号の前後のスペースが認識されているため変数名の後や代入した文字列の前にスペースが入っている)

set num1=1
set /a "num2 = num1 + num1"
echo %num2%
計算式の結果を代入するにはset /a "計算式"ですがこのダブルクォーテーション中は変数参照に%がいらずスペースは文字区切りとして認識されてます。

ダブルクォーテーションの扱い

set var3="ghi"
echo %var3%
 実行するとダブルクォーテーションごと「"ghi"」が出力されます(は?)
 空白や制御記号が含まれる文字列を引数としたいときはダブルクォーテーションで囲みますがダブルクォーテーションがそのまま認識されてる?と思いました。今回のバッチスクリプトを組むときにファイルの絶対パス文字列を引数とするdelコマンドやcopyコマンドを使ったのですがファイル名やディレクトリ名にスペース記号が入っていると言われ、ダブルクォーテーションごと引数として渡してもちゃんと動くのか不安でしたが結果的にこれらのコマンドではダブルクォーテーションで囲んでも囲まなくても問題なく実行できました。
 ただ、もっと複雑なものを組むときは詰まりそうなポイントだと思いました。変数をダブルクォーテーションで囲む場合など。バッチスクリプト中では極力ダブルクォーテーションは使わない方がいいのかもしれないですね。

ダブルクォーテーションを貫通する記号

 ダブルクォーテーションはスペース等が含まれる文字列を扱えますが変数参照時の%や!は普通に実行されるのでエスケープが必要です。またダブルクォーテーションが入ってる文字列は扱いがかなり厳しそうですね。

ifやfor中の変数の挙動(遷延変数を使用しました)

 if文中で変数に値を代入してそのまま参照してもif文を最初に読み込んだ時の変数の値が反映されるという挙動をするのでちょっとよく分かりませんでしたがとりあえず遷延変数を使うことで回避しました。遷延変数を引数とする時は%ではなく!で囲みます。

batファイルとしてダブルクリックで実行時の挙動

完全自分用
・カレントディレクトリはバッチファイルが置かれたディレクトリとなる。
・結構作成中に誤って起動してしまうことがあったので冒頭にpauseとか挟んでおくと良いのかも。

感想

 もっとありましたがとりあえずこんな感じ。ただバッチファイルを書く労力と実際の作業をよく比較して、バッチファイル書くほどのことなのか吟味することは必要そう。例えば実験や解析のたびに出力される複数のファイルに対して別の解析に使う用にファイル名を確認しなければいけない場合では有用と思いますが、その作業が一度だけでファイル数も数十個とかならわざわざコマンドプロンプトについて調べながらポチポチするより手動でやった方が早いのかもしれません。
 バッチファイル作るよりももっと良い方法があるのかもしれませんが…

この記事が気に入ったらサポートをしてみませんか?