サーチ…


宣言

単純な変数を作成し、それを値または文字列に割り当てるには、 SETコマンドを使用します。

SET var=10

ここで、コードは新しい変数varを値10で宣言します。デフォルトでは、すべての変数は内部的に文字列として格納されます。つまり、値10foo1234Hello, World!と違いはありませんHello, World!

引用符についての注意

使用される引用符は変数の値に含まれます:

SET var="new value"             <-- %var% == '"new value"'

変数のスペース

バッチ言語は、スペースを変数名の許容部分と見なします。たとえば、 set var = 10と指定すると、 varという変数に10という値が含まれます(varの右側と10の左側の余分なスペースに注意してください)。

引用符を使用してスペースを削除する

スペースを避けるために、割り当て全体を引用符で囲みます。変数名と値これはまた、行末の偶発的な末尾のスペースを防止します( 文字はスペースを表します)。

SET␣var=my␣new␣value␣           <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣         <-- '%var%' == 'my new value'

また、 &または|複数のステートメントを結合する場合は、引用符を使用します| - あるいは、シンボルを変数の値の最後の直後に置く:

SET var=val & goto :next        <-- '%var%' == 'val '
SET "var=val" & goto :next      <-- '%var%' == 'val'
SET var=val& goto :next         <-- '%var%' == 'val'

使用法

echo %var%

このコードは、 varの値をエコーし​​ます

setLocal EnableDelayedExpansionが使用されている場合、以下はvarの値をエコーし​​ます(標準式%var%はそのコンテキストでは機能しません)。

echo !var!

バッチファイルでは、コマンドの一部または他の変数の一部として、あらゆるコンテキストで変数を使用できます。定義する前に変数を呼び出すことはできません。

変数をコマンドとして使用する:

set var=echo
%var% This will be echoed

他の変数での変数の使用:

set var=part1
set %var%part2=Hello
echo %part1part2%

可変置換

他のプログラミング言語とは異なり、バッチファイルでは、バッチスクリプトが実行される前に変数が実際の値置き換えられます。つまり、スクリプトが後で実行されるときではなく、コマンドプロセッサによってメモリに読み込まれるときに置換が行われます

これは、スクリプト内のコマンドなどの変数の使用を可能にし、等スクリプト内の他の変数名の一部、線である。この文脈における「スクリプト」として-またはブロック-コードの、丸括弧で囲まれました: ()

しかし、この動作は、ブロック内の変数の値を変更できないことを意味します。

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    ECHO %VAR%
    SET VAR=Goodbye
)

印刷する

Hello
Hello

(あなたが見ているように、コマンドウインドウでスクリプトを見ているのを見ると)評価されているからです:

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo Hello
    SET VAR=Goodbye
)

上記の例では、 ECHOコマンドは、スクリプトがメモリに読み込まれるときにHelloとして評価されるため、スクリプトはHello永遠にエコーしますが、多くのパスはスクリプトを通して行われます。

スクリプトが実行されている間に変数の "従来の"可変動作を達成する方法は、 "遅延拡張"を有効にすることです。これには、ループ命令(通常はバッチスクリプトのFORループ)の前にスクリプトにコマンドを追加し、変数の名前にパーセント記号(%)の代わりに感嘆符(!)を使用します。

setlocal enabledelayedexpansion 
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo !VAR!
    SET VAR=Goodbye
)
endlocal

印刷する

Hello
Goodbye

構文%%a in (1,1,2)は、ループを2回実行します:最初の場合、変数は初期値 'Hello'を保持しますが、2回目のループを通過します。 SET命令を1回目の最後のアクションとして実行します。これは修正値 'Goodbye'に変更されました。

高度な変数置換

今、高度な技術。 CALLコマンドを使用すると、バッチコマンドプロセッサはスクリプトの同じ行にある変数を展開できます。これは、CALLと修飾子を繰り返し使用することで、マルチレベル展開を実現できます。

これは、たとえばFORループで便利です。次の例のように、変数の番号付きリストがあります。

"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"

これを実現するには、次のFORループを使用します。

setlocal enabledelayedexpansion
for %%x in (%*) do (
    set /a "i+=1"
    call set path!i!=%%~!i!
    call echo %%path!i!%%
)
endlocal

出力:

c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt

変数!i!まず初期値の1に展開され、結果変数%1は実際のc:\MyFiles\test1.txtます。これは、変数i 二重に展開したものです。次の行に、 i再び二重を使用することによって、拡張されたCALL ECHOと共にコマンド%%変数接頭辞は、画面に出力(すなわち、画面上に表示されます)。

ループを連続して通過するたびに、(コードi+=1 )最初の数が1増加します。したがって、まで上昇2ループを通る第2パスに、およびに3 3パスで。したがって、スクリーンにエコーされた文字列は、各パスで変更されます。

複数の変数を宣言する

バッチの先頭に複数の変数が定義されている場合は、 置換文字列を使用して短い定義形式を使用できます。

@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"

for /f %%l in ('set _') do echo %%l
exit /b

_A=good
_D=6
_E=bad
_G=ugly

上記の例では、スクリーンに印刷すると、変数はアルファベット順にソートされています。

変数を配列として使用する

SET文でスペースを使用することで、配列に似たような動作をする変数のセットを作成することができます(実際の配列オブジェクトではありません)。

@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
    echo %%a
)
echo Get the variable directly: %var%

結果:

A
"foo bar"
123
Get the variable directly: A "foo bar" 123

インデックスを使用して変数を宣言し、特定の情報を取得することもできます。これは、配列の錯覚で、複数の変数を作成します:

@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
    echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%

結果:

A
foo bar
123
Get one of the variables directly: foo bar

上記の例では、 varはそれ自身では存在しないため、目的のインデックスが何であるかを明示せずにvarを参照することはできません。この例では、 !var[%%a]!感嘆符と組み合わせて、 setlocal enabledelayedexpansionも使用していsetlocal enabledelayedexpansion !var[%%a]! 。これに関する詳細は、 変数置換範囲のドキュメントを参照してください

変数の操作

set var=10
set /a var=%var%+10
echo %var%

varの最終値は20です。

2番目の行は、たとえばIF条件やFORループで使用されるコマンドブロック内では機能しません。標準的な環境変数拡張の代わりに遅延拡張が必要な​​ためです。

コマンドブロックでも動作するもう1つの優れた方法は次のとおりです。

set var=10
set /A var+=10
echo %var%

コマンドプロンプト環境は、符号付き32ビット整数値をサポートしています。

  • 加算+および+=
  • 減算-および-=
  • 乗算*および*=
  • 分割/及び/=
  • モジュラス除算%および%=
  • ビット単位AND &
  • ビット単位OR |
  • ビットごとのNOT ~
  • ビットごとのXOR ^
  • ビット左シフト<<
  • ビット右シフト>>
  • 論理NOT !
  • 単項マイナス-
  • ()

Windowsのコマンド・インタプリタは、算術式の64ビット整数値または浮動小数点値をサポートしていません。

注意:演算子%は、 %%としてバッチファイルに記述して演算子として解釈する必要があります。

set /A Value=8 % 3コマンドラインを実行するコマンドプロンプトウィンドウで、値2を環境変数Value割り当て、さらに2出力します。

バッチファイルでは、値2を環境変数Valueに割り当てるには、 set /A Value=8 %% 3と書かset /A Value=8 %% 3なければならず、 STDOUT (標準出力)を処理するためにそれぞれ何も出力されません。バッチファイルの行set /A Value=8 % 3では、バッチファイルの実行時にオペレータ見つからないというエラーメッセージが表示されます。

環境では、通常の文字列変数ではなく、算術演算にのみスイッチ/Aが必要です。

set /A後の算術式の各文字列は、数値でも演算子でも環境変数の名前として自動的に解釈されます。

そのため、 %variable%または!variable!変数の値を参照することはできませ!variable!変数名は、最初の文字で始まるコマンドブロック内に特に有用である数字でないと単語文字(0-9A-ZA-Z_)からなる場合に必要ではない(とマッチングで終わります)

数値は、C / C ++関数strtolbaseがゼロの文字列から整数に変換されます。これは、自動的に基底を決定することを意味し、予期しない結果につながりやすくなります。

例:

set Divided=11
set Divisor=3

set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor

echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%

set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3

echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%

set /A Result%%=7
echo -90 %%= 7 = %Result%

set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue

echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%

この例の出力は次のとおりです。

11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4

算術式の評価で定義されていない変数は、値0で置き換えられます。

入力から変数を設定する

SETコマンドで/pスイッチを使用すると、入力から変数を定義できます。

この入力はユーザー入力(キーボード)です:

echo Enter your name : 
set /p name=
echo Your name is %name%

これは次のように単純化することができます:

set /p name=Enter your name :
echo Your name is %name%

あるいは、ファイルから入力を得ることができます:

set /p name=< file.txt

この場合、 file.txtから最初の行の値を取得します

ファイル内のさまざまな行の値を取得する:

(
   set /p line1=
   set /p line2=
   set /p line3=

) < file.txt


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow