windowsバッチ作成のメモ
どうしてもwindowsバッチで処理をしたいということがあったので、
久しぶりに作ってみましたが、いろいろ苦戦したのでメモ。
①for文の中でサブルーチンを利用する場合
1ファイル内にサブルーチンを複数作っている場合、なぜか呼び出していない
サブルーチンも実行される事象が発生。どうやら下記のようにしないといけないらしい。
■読み込みファイル
a
b
c
d
e
■実行ファイル
@echo off
setlocal enabledelayedexpansion
for /f %%a in (c:\work\ccc.txt) do (
set line=%%a
if "!line!" == "c" (
echo if①のなか
call :output
)
if "!line!" == "d" (
echo if②のなか
call :getout
)
)
echo exit_
:output
echo output
:getout
echo getout
■実行結果
if①のなか
output
getout
if②のなか
getout
exit_
output
getout
上記のようになぜかif文に入ってないときもサブルーチンが呼び出されてしまう
ようです。
回避策はサブルーチンの前にgoto :eofをつければいいらしい。理由については
調査中です。
②使えそうな変数について
いくつか使えそうな変数があったのでメモ
・バッチファイルのカレントディレクトリを取得
%dp~0%
・日付、時刻のフォーマット変更
set date_fmt=%date:/=% (20130525)
set time_fmt=%time:~0,8% (0:17:12)
→ログとか出力するときに使えそうです。
③数値計算
何かの数を計算したい場合のカウント方法
set /a count=%count%+1
④標準入力を指定したファイルから得る場合に1行目のみ取得する方法
set /P version=<%input_file%
→input_file部分にファイル名を指定。ヘッダー情報を取得するのに便利です。
まあ1行目だけですけど。
⑤④の拡張版を作ってみました。指定した複数行のヘッダーを取得する。
REM ファイルの任意の行を読み取る(ヘッダー)
SET COUNT=0
SET DATA=
setlocal enabledelayedexpansion
FOR /F "" %%i IN (c:\work\bbb.txt) DO (
CALL :MYSET %%i
REM LSSは比較演算子
IF !COUNT! LSS 3 (
ECHO !DATA!
set DATA=
) ELSE (
REM ヘッダー情報を下記出した後は処理終了する
exit /b
)
)
:MYSET
SET /A COUNT=%COUNT%+1
@REM 1行目だったらDATAへSET
IF %COUNT% LSS 3 ( SET DATA=%1 )
echo %COUNT%
@REM EXIT /B で呼び出し元へ戻る
EXIT /B
ちょっと複雑に見えますが、 カウンタを組み合わせてn行目以下を
取得できるようにしています。
⑤sleepコマンドの代用
ping localhost -n 60 > nul
→sleepコマンド相当なないそうなので、pingコマンドを利用します。
pingの間隔が1秒で-nで秒数指定が可能です。
雑記
CSSとかよくわかってないんですが、もう少しデザインを変えてみやすいものに
したいですねー。。。ソースとかきれいに見せたい・・・
参考サイト
http://tounderlinedk.blogspot.jp/2011/05/for-f-1-for1-windowsbatcmd.html
http://www.se-japan.com/memo/batch/#008
http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html
http://d.hatena.ne.jp/ymaru/20071123/p1
http://d.hatena.ne.jp/language_and_engineering/20130502/PatternsOfMSDOSorBAT