tjinjin's blog

自分用のメモです

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