FC2ブログ

batファイルを作ることになったメモ

今までbatファイルを(Qt同様に)引き継いで使っていたわけですが,
それを読んだりちょっと変更するだけでなく,自分で作る必要がついに.

改めてbatファイルの様々な構文の,いろいろな使い方というのを知りました.
そのサイトやら,使ってみた方法などをメモしていきます.
ヘッダー(&フッター),コメントアウト,変数の取扱い,for文,ファイル入出力,他のbatファイルの実行,待機までまとめます.
他のファイルの実行,ちょっと説明が怪しいので書かないことにします.そもそもプログラミングの理解が足らないような…

主にこちらを参考にして書きました.
開発に約立つ,BATファイルの書き方・パターン集

batファイルを読み込んでコマンドライン操作をする場合が前提です.打ち込むのが面倒だし間違ってたらすぐ直せるという必要からです.まずは頭に
@echo off
SETLOCAL enabledelayedexpansion
といれちゃってからコメントしましょう.
一行目の@echo offがないと,読み込んでいったものが全てechoされます.つまり,読み込んだ文を一行ずつ,そのまま出力してくれます.邪魔,切る.
次の行のヨクワカラナイ長いやつは,変数の遅延展開を可能にするコマンド.batの環境変数は即時展開と遅延展開というものがあり,値が更新されていくようなものを使う場合...forなど...には遅延展開の宣言が必要です(変数の項で即時展開,遅延展開の書き方を説明します).
遅延展開の宣言は,SETLOCALからENDLOCALまでの間です.頭にSETLOCALを宣言したので,batファイルの最後にENDLOCALしておきます(実際は省略可能のようです).

rem ~~~
コメント化する命令です.
その行の最初にrem(ember)を書けば,行全体が命令ではない文として認識されます.

rem set 変数名=格納する値
set mydomain=amefuriyame
set mypath=fc2.com
set myhtml=%mypath%.%mydomain%

set /a iter1=1
set /a iter1=!iter1!+1
set /a iter1=!iter1!+1
変数を定義します.
setは他にも色々使い方はありますが,変数に関して言えばsetが使われるわけです./a(rithmetic)は,=の後の文を式として読み込むものです.例えば,"1+1+1"という値の入った変数を/aで代入すると3になって格納されます.

%~~%と囲めば,変数の即時展開ができます.これにより,例えばecho %myhtml%とすれば,出てくるのはfc2.com.amefuriyameです.全然ドメインでも何でもないですが.
!~~!と囲めば,変数の遅延展開ができます.これにより,実行されたときに値が変化してくれるので,最後までiter1を読むとecho !iter1!は3と返ってきます.

…実はこの場合,!~~!ではなく%~~%でも同じ結果がでます.ちょっとびっくりしましたが,「実行されたとき」というのが何と対比しているのかが重要でした.比べられるのは「読み込むとき」です.
読み込むときに,読み込んだブロックごと変数を代入してしまうのが即時展開%~~%.読み込むブロックというのは例えばif判定してから真なら実行する中身までの全て.for文で実行する中身の全て.
今回はそういうブロックに相当するのが一行ずつです.さて,ブロックを作ってみましょう…
set iter1=1
(
set /a iter1=!iter1!+1
set /a iter1=!iter1!+1
)
むだにカッコを前後につけるだけです.
この状態で色々なところにecho !iter1!やらecho %iter1%やらやってみると,感覚がつかめると思います.
(set iter1=1もカッコの中に入れてしまうと,echo %iter1%はただのechoと同じになる,という点だけ注意すると比較できるでしょう.)
参考:遅延環境変数とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

さて,for文ですが,いろいろなオプションで様々なことができます.
参考:.bat(バッチファイル)のforコマンド解説。
今回は使った/L,/Fオプションだけ紹介./Lが数値を更新していくfor文,/Fがファイルを扱う文です.
for /L %%i in (1,2,10) do (
echo %%i
set /a twice=%%i*2
echo !twice!
)
for文の変数は%%と2つ重ねて.
(1,2,10)は1から始まり,2ずつ増やし,10を越したら実行しないという意味です.減らすことも可能で,整数です.
/Lを使わない場合,(1,2,10)の代わりに整数リストを配置します.リストは使ってないのでわかりません.参考に示すようなやり方をすればなんとなくでもできます.
参考:新潟工科大学 情報電子工学科 4.2 for文

echo HeaderMsg > file1_3.txt
for /F "skip=4 tokens=1,3 delims=," %%a in (file1.csv) do (
echo %%a
echo %%b >> file1_3.txt
)
ファイルを扱うためのforです.参考:外部ファイルを読み込む
file1.csvの先頭4行をskipし,","で区切って読み,1列目と3列目をaに続く変数に格納する.それを行がなくなるまで繰り返す.と読みます.
aに続く変数に格納ってなんだよ,って話ですが,tokensで指定した個数(今回は,1列目と3列目を格納するので2個)だけ,a,b,c,…と勝手に宣言して格納してくれます.ということで,aをechoして,bをfile1_3.txtに書き出してもらいました.
>1個でファイルは初期化されます.>>と2個になるとファイルの最後尾に追記していく形です.file1_3.txtはHeaderMsgという文字列で初期化されました.その後,file1.csvの3列目だけがfile1_3.txtに記録されます.
以上,ファイル入出力を同時にやりました.

待機するのにwaitもsleepもないということで
ping localhost -n 5 > nul
が提案されています(一番最初に紹介した参考ページ).なんだか,面白い.

pauseというコマンドもあります.pauseは待機ではないですが,入力待ちになるものです.使えばわかります,これかー!,と.

以上,batファイルの加工現場でした.
スポンサーサイト



プロフィール

satsuki

Author:satsuki
記事を消しつつ、ころころ変えながら運用中

最新記事
最新コメント
月別アーカイブ
カテゴリ
訪問者数
検索フォーム
リンク
QRコード
QR