最近勉強がてらbatを作っているのでその備忘録。
主に私が詰まったり悩んだところを書き連ねるので、ちゃんとした知識が欲しい方は他サイトでしっかり調べるのがいいです。
テキストに書いてるメモ内容をそのまま投下なのであくまで私用(言葉遣いとか特に)です。
そのうちちゃんと整形するかもしれません。
- boolean型がない
むしろ文字型と数値型(?)しかない
isAとかの変数に文字列としてtrue/falseを格納し代用 - 変数が破棄されない
setlocalしないと全部グローバル
サブで定義したやつがメインでも使える
ややこしい上に可読低下になるからこまめにsetlocalしろ
逆にグローバルが欲しいときはsetlocalの外で指定する - for内ではラベルが使えない
breakもcontinueもない、ifで代用
bat自体終わらせていいならcall先で「goto :EOF」使って抜けるのもあり
(:EOFは予約語、飛び先を指定する必要はない、EOFだと飛ばん)
forを使わずラベルで回せ - ANDやOR比較できない
「if %a%==1 if %b%==2 (~)」でANDは代用できる、else以降は非推奨
ORは無理
switch~caseもないからごり押しかドモルガンの法則を思い出せ - 比較するときは比較演算子か==、<>とかはない
==の時はnotが使えるけど比較演算子では使えない 連続で初期化できない
空である目印として*を代入
上書き確定してるやつか、そもそも使う直前で定義した方がいいかも
出来ん理由は知らん
→連続初期化できる
後続のifで落ちてただけ
(「変数が空か確認する」が原因)- forやif内で加工した変数は即時反映されない
forやifを抜けたら反映される
内部で表示とか計算とかサブルーチンに渡したいのであれば
遅延環境変数を使う必要がある
setlocalにenabledelayedexpansionを追加して!で変数を囲む
長ったらしいけど多分enable delayed expansion
google先生曰く「遅延拡張を有効にする」という意味、納得 - メソッドがない
setlocal-endlocalとサブルーチンで代用(?)
1ファイル内で複数書くなら終わりに「exit /b」必須
究極ファイル分けして管理でもいいかもしれん
引数の有無でcallか直叩きかは判断できそう - 引数が9個しかない
10個以上渡せるけど参照は%1~%9まで、shiftでずらすしかない
%0は実行bat名用で使用不可 - 戻り値がない
それっぽいのはある
「endlocal && set a=%b%」で呼び元の変数aに呼び先の変数bを入れれる
enabledelayedexpansionが付いてても一緒
&&で繋げれば複数戻せそうな感じはする、試してないから知らん
→3つまでは試した、複数戻せる
ただし「endlocal && set a=%b% && set c=%d%」みたいに書くと変数aに
スペースが入る
=の後ろから&&の前までがsetの範囲になるんやと思う
見た目気持ち悪いけど「endlocal && set a=%b%&& set c=%d%」にするか
trimするかの2択やと思う、楽なのは前者 - 配列がない
配列もどきならできるっぽいけど入れるのも出すのもごり押し
出すときはcall setとか多重展開必須やと思う
これはどっかでやってみたい - trimがない
引数をそのまま返すサブルーチンで代用
変数にセットしなおせばいいらしい - 空のifはこける
動確のために動かしてちょくちょくやらかす
適当に「if %a%==1 (echo hi)」とかやる必要がある
hiとかheyとか条件指定の変数とかよく指定する - 場所固定のオプションがある
for (~) in (where~)でパス指定する際は「where /r パス (追加オプション) 取得対象」の順にする
オプション散らばってるの見づらいと思って固めたらこけた
ヘルプやお手本通りに書け
- ループの書き方の判断基準
for:ディレクトリやファイル、ファイル内の情報を引っ張って編集したいとき
ラベル:ディレクトリ等の取得/編集をしないなら基本こっち - 比較の書き方の判断基準
比較演算子:数値の比較
==、not ==:文字列の比較
- 引数(変数)名の一部に変数を使う
引数名(%2~%9)全部書くの面倒で使用
「call set a=%%%cnt%%」で出来る
callは展開したい変数-1の数書く、多分あってると思うけど原理は分からん
予想だけど仮にcntの中身が3、引数がhoge fuga piyo hogehogeの4つが指定されてるとして
①callで%cnt%を展開(%%%cnt%%→%%3%)
②通常通り%3を展開(%%3%→%piyo%)
③複数の変数を用いて展開するとき、”1つの変数ですよ”と言う意味で
%や!囲うためaの中身は「piyo」となる
もしかしたら③が真っ先に処理されるかもしれん、よう分からん
変数内が数値の場合はcallなしで「set /a a=!%%cnt%!」で行けるらしい
試してない
余談:③のまとめるよう%や!を抜かすとどうなるか
システム日付から和暦年を取得する処理を作ってこけた覚書
yyyymmdd形式に日付を整えてから同形式の平成最終年を引いて
和暦日付を出す
別途mmdd形式の日付を用意して空に置換する
桁数判定が面倒やったからこうしたけどy形式になるから微妙かもしれん
set JPYear=%date:/=%
set /a JPYear=%JPYear% – 20180000
set day=%date:/=%
set day=%day:~4%
call set JPYear=%JPYear:%day%=%
ここで一回JPYearの中見るとdayになってる
call set JPYear=%%JPYear:%day%=%%
両端に%を追加すると想定通り中身が4になる
ちなみにcmdに直接入力だと両端の%なくても出る
forの変数でも直接とbatとでは%の数変わるから似たようなもんやと思う
全然気付けんで@echo onしたらremした変数も反映されてた、以外 - 空の変数を出力する
echoで中身が空の変数を出力するとecho状態(「ECHOは<OFF>です」とか)が出る
空のまま表示させたいなら「echo.%a%」で回避できる
ゴミが入るけど「echo %a% a」でも可
ようは表示されるものがあればいい
「echo.」とか「echo;」で改行もどき - substringする
毎回忘れる
「%a:~(開始),(終了)%」で取れる、0始まり - 変数が空か確認する
普通の書き方だとエラーになる
“”で変数を括って比較「if “%a%” == “” (~)」
- メインプログラムの動確をする
確認したいとこまで動かしてpauseのctrl+cで抜ける
部分的に確認したいとこがあれば別bat使う
ただ事前情報整えるのがだるいからあんまやらん
想定結果にならんまま詰まって原因調査するときぐらい
別batでやってから移植の方がいいとは思う
構築中batを複製して動確対象以外をremするとか - サブルーチンの動確をする
テスト用batを用意してそこで確認するが吉
メインで動かすのはあくまで結合部分で単体は別batのがやりやすい
テストで作ってメインに移植の繰り返し
そうすればメインは基本動く状態で置いとけるはず - 数字の昇順を整える
Winの仕様だからどうしようもない
変数2個用意して振り分けて最後に結合するとかで出来そうな気はする
余力があったらやってみる
色んなサイトを見回ってたのにurlとか全然控えてませんでした…。
唯一気になってお気に入りしてたところとよくお邪魔するところは分かるので、早めに追記します。
(控えが職場端末なのでお許しを)
→追記しました。
参考
満遍なくお世話になりました
知識ゼロからのwindowsバッチファイル超入門
ピンポイントでお世話になりました
アプ研
BATファイルで動的な変数指定
Qiita
.bat(バッチファイル)のifコマンド解説。
.bat(バッチファイル)のforコマンド解説。
.bat(バッチファイル)で、setコマンドを使いこなすための5つの豆知識
上3つは作者が同じ方
バッチファイルの変数のスコープ(試行錯誤)
バッチファイルでの試行錯誤を回避するためのメモ-または人類には早すぎた言語
個人的にめちゃくちゃ好きな記事
灯火
バッチファイル : if 文条件分岐で AND と OR (複数条件指定)
ぱーくん plus idea
Windowsバッチ(.bat)で文字列の切り出しを行う(Substrみたいな)
Let’sプログラミング
コマンドプロンプト | バッチファイルで繰り返し処理を使う(FOR)
CapmNetwork
Windowsバッチファイル演算子
更新履歴
2022/6/28
一部内容修正と参考を追加しました。