Programming Field

Set - DOS/コマンドプロンプト コマンド一覧

実行中の環境(プロンプト)における環境変数の一覧の表示や、変数の値の追加・変更・削除を行います。

構文

set
set <var-name>=[<value>]
set /A <var-name>[=<expression>]
set /P <var-name>=[<prompt>]

オプション一覧

(引数無し) 現在の環境に割り当てられている環境変数の一覧を表示します。
<var-name> 環境変数の名前を指定します。
<value>

環境変数に書き込む値を指定します。省略すると変数<var-name>が環境から削除されます。

[Windows NT系] [拡張構文] <value>内に環境変数を用いる際、特殊な展開方法を用いることができます。

/A <var-name>[=<expression>] [Windows NT系] [拡張構文] <expression>を演算式として処理し、式の処理結果を変数<var-name>に設定します。コマンドプロンプト上で実行している場合はその値を画面に出力します。式内の数値が実際に計算に用いられ、数値以外の文字は環境変数名として、計算時に展開されます。指定できる記号(演算子)は「解説」をご覧ください。「=」文字とそれ以降を省略した場合は変数に対して何も処理を行いません(コマンドプロンプト上では出力のみ行います)。
/P <var-name>=[<prompt>] [Windows NT系] [拡張構文] ユーザーからの入力を変数<var-name>に設定します。<prompt>を指定すると、それをユーザーに入力を促すプロンプトとして表示します(<prompt> は改行されず、カーソルはその直後の位置で入力待ちとなります)。「=」文字は省略できませんが<prompt>は省略することができます。

解説

Set使用例

Setコマンドは環境変数を操作する際に用いるコマンドです。基本的には「set 名前=値」といった使い方がなされます。

環境変数について

「環境変数」は現在のプロンプト(Command.comCmd.exe)に登録されている「設定」の一つで、このプロンプト下で実行されるプログラムがこの値を利用します。Setコマンドを利用すると、現在のプロンプト下(環境)において新たな環境変数を追加したり既存の環境変数を変更・削除したりすることができます。

※ システムの設定としての環境変数を書き換えることはできません。システム設定を変更する場合は、MS-DOS/Windows 95/98/Me ではAutoexec.batを編集、Windows NT系では「システムのプロパティ」から変更を行います。([Windows Vista以降] Setxを利用して変更することもできます。)

環境変数の値をバッチプログラムなどで利用する場合、変数名を「%」文字で挟むことで自動的にその変数の値に展開されます。

[MS-DOS, Windows 95/98/Me] 「環境変数のための領域が足りません」というメッセージが表示された場合、現在のプロンプトに割り当てられている環境変数用のメモリ領域が不足していることを表しています。このメモリ領域の設定は「Command」の「/E」スイッチをご覧ください。

代表的な環境変数には「Dircmd」(Dirコマンドの既定スイッチ)や「Copycmd」(CopyMoveXcopyの各コマンドの既定スイッチ)、「COMSPEC」「Prompt」「Path」などがあります。

環境変数について詳しくは「環境変数について」のページをご覧ください。

環境変数展開の拡張

[Windows NT系] [拡張構文] <value>内で環境変数を用いる場合に、特殊な構文を使うことで環境変数の展開方法を変更することができます。

「%」のページに移動しました。

/A スイッチで利用できる演算子

[Windows NT系] [拡張構文] /Aスイッチにおける、式で利用できる演算子は以下の通りです。なお、数値は符号付き32ビット整数で処理されます。また、以下で「A」や「B」は計算結果(数値または括弧でくくられた式)を表します。

優先度記号意味
8(A)括弧内に式を記述することでその式を優先的に処理します。
7!A[Not] Aが0なら1、それ以外なら0とします。
~A[ビット反転] Aに1を加えて符号を反転したものとします。
-A[符号反転]
6A * B[乗算]
A / B[除算]
A % B[剰余] AをBで割った余りを表します。
5A + B[加算]
A - B[減算]
4A << B[論理左シフト] Aに「2のB乗」を掛けます。
A >> B[論理右シフト] Aを「2のB乗」で割ります(切り捨て)。
3A & B[論理積]
2A ^ B[排他的論理和]
1A | B[論理和]
0<var-name2> = B[代入] <var-name2>にBの結果を代入し、その値を計算結果とします。「=」の他に「+=」「-=」「*=」「/=」「%=」「&=」「|=」「^=」「<<=」「>>=」も利用できます。
なお、この式における代入先の変数は環境変数として追加(変更)されます。
-1A, B[式の区切り] AとBをそれぞれ計算し、Bの結果を計算結果とします。Bの結果のみが返りますがAも計算が行われ、例えばAに代入の式が含まれる場合は代入が実行されます。

サンプル 1

set MYVAR=

現在の環境に環境変数「MYVAR」が存在する場合、それを削除します。

サンプル 2

set PATH=D:\bin;%PATH%

「Path」環境変数の値の先頭に「D:\bin;」を追加します。

サンプル 3

set /P TEMPVAR=Hello< NUL

[Windows NT系] [拡張構文] 画面に「Hello」という文字列を改行なしで出力します。「set /P」は入力を促すプロンプトを改行なしで出力しつつ入力待ちになりますが、その入力を入力リダイレクト経由で「NUL」を与えることで、単に画面出力だけを行うような形にしています。

※ なおこの例では、「TEMPVAR」という環境変数が既に存在していた場合はその内容がクリアされます。不用意に環境変数を消去するのを避けたい場合は、Setlocalコマンドの併用も検討してください。

サンプル 4 [バッチファイル]

@echo off
setlocal
if not "%SETTING_PATH%"=="" goto check_path
:input_path
set SETTING_PATH=
echo settings.xml が含まれるパスを入力してください。(空入力で終了)
set /P SETTING_PATH="> "
if "%SETTING_PATH%"=="" goto end

:check_path
if not exist "%SETTING_PATH%\settings.xml" (
    echo 「settings.xml」がパス「%SETTING_PATH%」に見つかりません。
    goto input_path
)

TheProgram.exe /E

:end

[Windows NT系] [拡張構文] 環境変数「SETTING_PATH」をチェックし、セットされていなければ「set /P」を用いて入力を促すプロンプトを表示させます。表示するメッセージが長いため、先にEchoを使ってメッセージを表示し、入力を受け付ける行には「< 」のみを表示させるようにしています。

なお、入力待ちのときに Ctrl+C を入力すると処理を中止させることができます。

※ 入力を促すプロンプトの文字に「>」を含んでいるため、出力リダイレクトとみなされないように「" "」で括っています。

サンプル 5 [バッチファイル]

@echo off
setlocal
call :strlen "Test String"
echo %STRLEN_RET%
goto end

:strlen
set STRLEN_RET=0
set STRLEN_TEMP=%~1
:strlen_loop
if "%STRLEN_TEMP%"=="" exit /B 0
set /A STRLEN_RET="STRLEN_RET+1"
set STRLEN_TEMP=%STRLEN_TEMP:~1%
goto strlen_loop

:end

[Windows NT系] [拡張構文] 引数で指定された文字列の長さを返す「strlen」の処理をバッチファイルで記述した例で、処理結果を環境変数「STRLEN_RET」に設定しています。12行目で数値を増やし、13行目で変数「STRLEN_TEMP」の先頭1文字を削っています。なお、9行目ではバッチファイルに渡された引数からダブルクオーテーションマークを取り除くための拡張構文を用いています(「%」の説明も参照)。

関連項目