Windowsバッチファイル変数

コマンドプロンプト変数の宣言

変数の宣言方法

SETコマンドで変数(環境変数)の設定を行います。

変数名と「=」の間はスペースを入れず記述する必要があります。(空白を含んだ変数名が設定されてしまうため。)


SET 変数名=[文字列]
SET /A 変数名=[数式]

変数を参照する場合は、変数名を「%」で囲みます。


ECHO %変数名%

変数のローカル化(変数スコープを設定する)

変数のローカル化とは、setlocalからendlocalの範囲内で定義した変数がその中だけ有効となり、外部の同名の変数に影響を及ぼさないようにすることです。

指定 説明
setlocal バッチファイルでの環境変数の使用を開始する。
endlocal バッチファイルでの環境変数の使用を終了する。

@echo off
setlocal
set num=1
echo %num%
endlocal
echo %num%

数値の表現

SETコマンドの「/A オプション」を用いることで変数に数値を代入することができます。


SET /A num=12345
SET /A num=0
SET /A num=2147483647
SET /A num=-2147483647

数値には16進数や8進数を指定することもできます。16進数は「0x」で始まり、8進数は「0」で始まります。


SET /A num=0x10
SET /A num=022

代入できるのは整数(32bit 値)のみであり、小数は代入することはできません。

以下の式はエラーとなります。


REM 32bitを超えた場合
REM   エラーメッセージは「無効な数字です。数値は 32 ビットで表記される数値です。」
SET /A num=2147483648

REM 小数の場合
REM   エラーメッセージは「演算子がありません。」
SET /A num=1.23

文字列の表現

SETコマンドを用いることで変数に文字列を代入することができます。

文字列には引用符(ダブルクォーテーション等)を指定する必要はありません。

なお、「=」の後の空白も文字列として処理されます。


SET str1=aaa
SET str2= bbb
REM 以下は文字列を結合させて「aaa bbb」を定義します。
SET str3=%str1%%str2%

データ型について

コマンドプロンプトで配列やハッシュ変数はサポートされていません。


Windowsバッチファイルにおける遅延環境変数の展開

環境変数の展開方法には「%変数%」と「!変数!」の二通りがあります。「%」は構文解析時に環境変数の展開を行い、「!」はコマンド実行の直前に(つまり遅延して)環境変数の展開を行います。


例えば、以下のスクリプトを実行します。


@echo off
setlocal
set OSINFO="MacOSX"
if %OSINFO% == "MacOSX" (
  set OSINFO="unix"
  echo %OSINFO%
)
endlocal

構文解析時に環境変数を展開するため、実行結果は「MacOSX」となります。

そこで、「enabledelayedexpansion」を用いて遅延環境変数を有効にして、変数名を「!」で囲みます。


@echo off
setlocal enabledelayedexpansion
set OSINFO="MacOSX"
if %OSINFO% == "MacOSX" (
  set OSINFO="unix"
  echo !OSINFO!
)
endlocal

コマンド実行時に環境変数を展開するため、実行結果は「unix」となります。


Windowsバッチファイルの引数

バッチファイルでは、コマンドオプションのように引数を渡すことが出来ます。渡された引数は「%1 から %9までの変数」として保存されます。 「%0」は実行中のバッチファイル名が保存されます。

詳細はWindowsバッチファイル - 引数を参照してください。


バッチパラメータ・修飾子

バッチファイルでは、バッチパラメータと呼ばれる変数を利用する事ができます。

「%~」構文は「%変数」を様々な情報に展開します。


以下はバッチファイル実行時に付加された最初のパラメータ(第一引数)である「%1」を「%~」構文に従って展開した例です。

指定 説明
%~1 全ての引用句(")を削除して%1を展開する。
%~f1 %1を完全修飾パス名に展開する。
%~d1 %1をドライブ名だけに展開する。
%~p1 %1をパスだけに展開する。
%~n1 %1をファイル名だけに展開する。
%~x1 %1をファイル拡張子だけに展開する。
%~s1 展開されたパスはMS-DOSの「8.3形式」でも短い名前だけを含む。
%~a1 %1をファイル属性に展開する。
%~t1 %1をファイルの日付・時刻に展開する。
%~z1 %1をファイルのサイズに展開する。
%~$PATH:1 PATH環境に指定されているディレクトリを検索し、最初に見つかった完全修飾名 に%1を展開する。環境変数名が定義されていない場合、また検索してもファイルが見つからなかった 場合は、この修飾子を指定すると空の文字列に展開する。

動的な環境変数

コマンド拡張機能が有効な場合、実行時に動的に値が計算される環境変数があります。

指定 説明
%CD% 現在のディレクトリ文字列に展開します。
%DATE% DATEコマンドと同じフォーマットで現在の日付に展開します。
%TIME% TIMEコマンドと同じフォーマットで現在の時刻に展開します。
%RANDOM% 0 から 32767 の間の任意の 10 進数に展開します。
%ERRORLEVEL% 現在の ERRORLEVEL の値に展開します。
%CMDEXTVERSION% 現在のコマンド プロセッサ拡張機能のバージョン番号に展開します。
%CMDCMDLINE% コマンド プロセッサを起動したオリジナル コマンド ラインに展開します。
%HIGHESTNUMANODENUMBER% コンピューター上の最大NUMAノード番号に展開します。

関連ページ