はじめに
久しぶりにWindowsのバッチファイルで、、、
- コマンドを実行
- 上記1の実行結果を取得して次のコマンドに引き継いで実行
なんてことをしたくなった。
この時、
- 手順1の実行結果には複数の情報がある。
- その複数の情報を次のコマンドの引数(変数1、変数2、変数3)といった形で渡したい。
とも。
これをいざ実現しようと思ったら「複数の情報」→「変数1/変数2/変数3」に取りだすことに苦労したのでまとめる。
やりたいこと
コマンドの実行結果(複数の情報)を取りだし変数1/変数2/変数3に取りだす。
サンプルコード
@echo off
rem for /f "tokens=1-5* usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo %%i %%j %%k %%l %%m
for /f "tokens=1-5* usebackq" %%i in (`COMMAND`) do (
@set VAR1=%%j
@set VAR2=%%l
@set VAR3=%%m
)
rem echo VAR1=%VAR1%
rem echo VAR2=%VAR2%
rem echo VAR3=%VAR3%
NEXTCOMMAND %VAR1% %VAR2% %VAR3%
ピックアップ
rem for /f "tokens=1-5* usebackq" %%i in (`COMMAND`) do echo %%i %%j %%k %%l %%m
今回の要件の実現可否を調べた時にヒットするやり方は上記のようにechoを使う方法だった。
これを変数1/変数2/変数3に設定する話は後述するとして、ここではこの構文に不慣れな方向けに説明したい。
上記のコマンドを日本語で説明すると、
COMMANDの実行結果を空白またはタブで5個分を区切り、その5つを表示(echo)する。
となる。さらに分割して説明していこう。
tokens
tokensが”5個分を区切り"に相当する。
サンプルコードとその結果で挙動をみていく。
@echo off
for /f "tokens=1 usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
for /f "tokens=2 usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
for /f "tokens=1,2 usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
for /f "tokens=1-3 usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
for /f "tokens=1-3* usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
for /f "tokens=1-5 usebackq" %%i in (`echo aaa bbb ccc ddd eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
C:\Users\USER>D:\tools\sample.bat
i=aaa j=%j k=%k l=%l m=%m ・・・ 1個目だけ
i=bbb j=%j k=%k l=%l m=%m ・・・ 2個目だけ
i=aaa j=bbb k=%k l=%l m=%m ・・・ 1,2個目を
i=aaa j=bbb k=ccc l=%l m=%m ・・・ 1~3個目を
i=aaa j=bbb k=ccc l=ddd eee m=%m ・・・ 4個目以降はまとめて4つ目に
i=aaa j=bbb k=ccc l=ddd m=eee ・・・ 1~5個目を
コマンドの実行結果とtokensの書き方、%%i ~ %%mへの格納のされ方を理解しておこう。
usebackq と `COMMAND`
バッククォート(`)で囲まれたCOMMANDを実行する的な意味合いになるようなのでこの書き方はセット。
%%i ~ %%m
%%i in (`COMMAND`)
の%%i
は%%a
でもよく、do
の後で記載する変数がそのアルファベットに続く形をとる必要がある。
%%a
だと
%%a in (`COMMAND`) do echo %%a %%b %%c %%d %%e
とする必要がある。
delims
今回のサンプルは区切り文字が空白で、デフォルトも空白またはタブであるため省略したが、カンマ(,)の場合は以下のようになる。
@echo off
for /f "tokens=1-5 usebackq delims=, " %%i in (`echo aaa,bbb,ccc,ddd,eee`) do echo i=%%i j=%%j k=%%k l=%%l m=%%m
C:\Users\USER>D:\tools\sample2.bat
i=aaa j=bbb k=ccc l=ddd m=eee
"... delims=, "
である必要に注意(カンマの後ろに半角空白)。
"... delims=,"
だと正常に区切られなかった。
実行結果を変数に取りだす
さて本題。
for /f "tokens=1-5* usebackq" %%i in (`COMMAND`) do (
@set VAR1=%%j
@set VAR2=%%l
@set VAR3=%%m
)
上記のロジックでCOMMANDの実行結果から複数の情報を変数1(VAR1)/変数2(VAR2)/変数3(VAR3)に取りだしている。取りだしているのは先頭から5個分の中の2番目(%%j)と4番目(%%l)と5番目(%%m)の3つ。
for /f "tokens=2 usebackq" %%i in (`COMMAND`) do @set VAR1=%%j
変数に取りだしたい情報が1個の場合は上記のような書き方もできる。(他のサイトで見るやり方)
さいごに
上記の内容を駆使してやりたかったことも紹介したいので次の記事で公開したいと思います!