34
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

【Windowsバッチ】コマンド実行結果を環境変数に代入する方法

ちょっとバッチを書いていてこれは知ってると便利!と思ったのでメモ。

LinuxのBashシェルなどでこのように書く処理

Bashの場合
# hoge.txtの行数を取得してLINECOUNTに代入するコマンド
LINECOUNT=`wc -l hoge.txt`
echo $LINECOUNT

実はWindowsバッチでも同じようなことができる。

Windowsバッチの場合
rem hoge.txtの行数を取得してLINECOUNTに代入するコマンド
for /f "usebackq" %%A in (`type hoge.txt ^| find /c /v ""`) do set LINECOUNT=%%A
echo %LINECOUNT%

め、面倒臭え……。
素直に「変数=`コマンド`」じゃいかんのかと思うけどこう書くらしい。
また「`コマンド`」内でパイプ「|」を使う場合はエスケープが必要で「^|」と書く。

ちょっと応用して、指定したフォルダ下にあるテキストファイルの名前、行数、サイズのリストを取得するバッチの例。

Windowsバッチの場合
rem 入出力設定
set DIR=%~dp0data
set OUTPUT=%dp0count.txt
if exist %OUTPUT% del %OUTPUT%

rem カウント出力処理
setlocal enabledelayedexpansion
for /f "usebackq" %%I in (`dir /b %DIR%`) do (

    rem ファイル行数を代入
    for /f "usebackq" %%J in (`type %DIR%\%%I ^| find /c /v ""`) do set LINECOUNT=%%J

    rem ファイルサイズを代入
    for %%K in (%DIR%\%%I) do set SIZE=%%~zK

    rem ファイル名、行数、サイズを出力
    echo %%I    !LINECOUNT!    !SIZE!>> %OUTPUT%
)

バッチのfor文内で環境変数を展開する場合は「setlocal enabledelayedexpansion」の指定が必要になる。
また環境変数の展開は「%変数%」ではなく「!変数!」となる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
34
Help us understand the problem. What are the problem?