バッチファイルの記述メモ


はじめに

先日、業務でバッチファイルを作成した。今まで実行することばかりだったため興味はあったが、作成してみてすこぶる手こずってしまった。。
中でも独特だった記述についてメモ書き程度に記しておく。

forコマンド

forコマンド内での変数の扱い方に一癖あり。
バッチファイルのforコマンド内では変数の中身を都度更新してくれない。そのため以下の書き方ではエラーとなる。

command.bat
@echo off
rem ファイル内のデータを取得
for /f %%i in (test.txt) do (
    set x=%%i
rem 実行結果でエラー発生
    echo %x% 
)

遅延環境変数なるものを使い、以下のような書き方で変数を扱うことで都度取得した情報が変数から参照できるようになる。

command.bat
@echo off
rem 遅延環境変数の使用を宣言
setlocal enabledelayedexpansion
rem ファイル内のデータを取得
for /f %%i in (test.txt) do (
    set x=%%i
rem !で変数を囲むことで一行ずつ取得できる
    echo !x!
)

トークンオプションの指定

今回は以下のトークンオプションを使用した。

tokens:何番目のトークンを指定するか
delims:トークンの区切り文字を指定

tokensは指定した個数分、宣言した変数のアルファベット順に値が格納される。

test.txt
1,2,3,4
a,b,c,d
A,B,C,D
command.bat
@echo off
setlocal enabledelayedexpansion
rem ファイル内のデータを一行ずつ取得
rem カンマ区切りで1,2,3番目のデータを取得
for /f "tokens=1,2,3 delims=," %%a in (test.txt) do (
   rem アルファベット順に格納される
   set x=%%a
   set y=%%b
   set z=%%c
   echo !x!
   echo !y!
   echo !z!
)

上記のオプション、トークン以外にも存在するため、ケースに合わせて指定を変える。詳細は以下の記事を参照した。
https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9

文字列検索

command.bat
@echo off
rem 検索対象文字列
set str=abcdefg
rem 検索文字
set search=abc

rem 文字列の検索
echo "%str%" | find "%search%" > NUL
rem 検索結果確認(存在する:0, 存在しない:1)
if not %ERRORLEVEL% 0 (
   echo 存在しました。
)

復習がてら、先ほどのforコマンドの中で扱うと以下のようになる。

command.bat
@echo off
rem 検索文字
set search=abc

rem 区切り文字を空にすることでファイル内のデータを一行ずつ取得
for /f "delims=" %%i in (test.txt) do (
   set str=%%i
   rem 文字列の検索
  echo "!str!" | find "%search%" > NUL
   if not !ERRORLEVEL! 0 (
      echo 存在しました。
   )
)