
set var1=Demo
set var2=%var1%
echo %var2%
rem Output:Demo
set var2
1 行に が含まれている場合、以下が機能しないのはなぜですかset var1
?
set var1=& set var2=
set var1=Demo& set var2=%var1%
echo %var2%
rem output:%var1%
どうすれば1行でset var2
表示できますか?var1
答え1
set var2
を 1 行に記述するとなぜ機能しないのでしょうかset var1
?
としてハリー指摘している:
変数の置換は、コマンドラインが実行される前にコマンドライン全体に対して行われます。その時点では、
var1
変数はまだ定義されていません。
遅延拡張を使用すると、この制限を回避できます。
@echo off
setlocal enabledelayedexpansion
set var1=Demo & set var2=!var1!
echo %var2%
endlocal
例:
F:\test>test
Demo
参考文献
- Windows CMD コマンド ラインの AZ インデックス | SS64.com
- Windows CMD コマンド (分類済み) - Windows CMD - SS64.com
- 解析 - Windows コマンド インタープリター (CMD.EXE) はスクリプトをどのように解析しますか? - Stack Overflow
- EnableDelayedExpansion - Windows CMD - SS64.com
- Endlocal - ローカル環境変数 - Windows CMD - SS64.com
- Setlocal - ローカル変数 - Windows CMD - SS64.com
答え2
変数の置換は、コマンドラインが実行される前にコマンドライン全体に対して行われます。その時点では、var1
変数はまだ定義されていません。
未定義変数の置換のルールは次のとおりです。
- 変数が対話的に入力された場合、置換は行われず、テキストはそのまま残ります。
%var1%
- バッチ ファイルで使用する場合、変数は null 文字列に置き換えられます。
var1
値を取得するには、このワンライナーを 2 行に分割する必要があります。または、@DavidPostill の回答を参照してください。
答え3
setlocal enabledelayedexpansion
「for」(ループ)と「call」を使用することで、遅延展開(「 」なし)を使用せずにこれを実行できます。
@echo off
set "var1=" & set "var2="
echo var1=[%var1%], var2=[%var2%]
:rem The one-liner:
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a"
::
echo var1=[%var1%], var2=[%var2%]
:end
出力:
var1=[], var2=[]
var1=[Demo], var2=[Demo]
同じ行に「echo var2」を実行する 2 番目の「for」ループを追加することもできます。
:rem The one-liner:
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a" & for /f "usebackq delims=" %%a in (`call echo var2^=[^%var2^%]`) do @echo %%a
::
:end
「最終」出力:
var2=[Demo]
「for」と「call」の内訳は次のとおりです。
for /f "usebackq" %%a Operates on a command that is enclosed in `backquotes`.
Executes that command and captures the output of that
command into variable %%a.
"delims=" Disables all delimiters when parsing the command
output. Default delimiters are "space" and "tab".
Not required for this specific example.
Used when the command output might contain delimiters.
(`call echo ^%var1^%`)
(`call echo var2^=[^%var2^%]`)
Use "call" to execute the echo command within a
separate process.
"^" escapes special characters like "%" and "=" when
the command is read by "for".
do @set "var2=%%a"
do @echo %%a Sets the variable "var2" from the output of the
command in the for loop.
In this case, the for command will execute just once.
If the output of the command spanned multiple lines,
the for command would execute once for each non-empty
output line.