1
1

More than 1 year has passed since last update.

バッチファイル内でコマンドの実行結果を複数の変数に取りだし利用する

Last updated at Posted at 2022-10-04

はじめに

久しぶりにWindowsのバッチファイルで、、、

  1. コマンドを実行
  2. 上記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個分を区切り"に相当する。
サンプルコードとその結果で挙動をみていく。

sample.bat
@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
sample.batの結果
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

今回のサンプルは区切り文字が空白で、デフォルトも空白またはタブであるため省略したが、カンマ(,)の場合は以下のようになる。

サンプルコード2
@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
サンプルコード2の結果
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個の場合は上記のような書き方もできる。(他のサイトで見るやり方)

さいごに

上記の内容を駆使してやりたかったことも紹介したいので次の記事で公開したいと思います!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1