Windowsバッチファイルのコマンドの結果で変数の値を設定する


98

Bash環境で作業しているときに、コマンドの結果として変数の値を設定するには、通常次のようにします。

var=$(command -args)

ここでvar、コマンドによって設定される変数ですcommand -args。その後、その変数にとしてアクセスできます$var

ほとんどすべてのUnixシェルと互換性がある、これを行うためのより一般的な方法は次のとおりです。

set var=`command -args`

つまり、Windowsバッチファイルのコマンドの結果を変数の値に設定するにはどうすればよいですか。私はもう試した:

set var=command -args

しかし、コマンドの出力ではなくにvar設定されていることがわかりますcommand -args

回答:


62

Jesseの説明を行うには、Windowsバッチファイルから次のように記述する必要があります。

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

ただし、Unixタイプのスクリプトに慣れている場合は、WindowsシステムでCygwinを使用することをお勧めします


19
for /f "delims=" %a in ('ver') do @set foobar=%aコマンドプロンプトで使用します。for /f "delims=" %%a in ('ver') do @set foobar=%%aスクリプトファイルでの使用
georg 2013

軽量な代替手段はGnu On Windows(github.com/bmatzelle/gow/wiki)です。コマンドプロンプトを開いて実行するだけbashです。その後、bashコマンドを記述できます。bashスクリプトを実行することもできます。
Nathan

4
コマンドにパイプが含まれている場合は、キャレットでエスケープする必要があることに注意してください。例:/ f "delims =" %% a in( 'echo foobar ^ | sed -es / foo / fu /')do @ set foobar = %% a
yoyo

35

Windowsのバッチコマンドは次のとおりなので、注意が必要です。

for /f "delims=" %%a in ('command') do @set theValue=%%a

Unixシェルステートメントと同じセマンティクスはありません。

theValue=`command`

コマンドが失敗し、エラーが発生する場合を検討してください。

Unixシェルバージョンでは、「theValue」への割り当ては引き続き発生し、以前の値は空の値に置き換えられます。

Windowsバッチバージョンでは、エラーを処理するのは「for」コマンドであり、「do」句に到達することはないため、「theValue」の以前の値は保持されます。

WindowsバッチスクリプトでよりUnix風のセマンティクスを取得するには、割り当てが行われるようにする必要があります。

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

UnixスクリプトをWindowsバッチに変換するときに変数の値をクリアしないと、微妙なエラーが発生する可能性があります。


2
Windowsと* nixの微妙な違いを説明していただきありがとうございます。
Jeroen Wiert Pluimers 2013

3
また、で特殊文字をエスケープすることも忘れないでくださいcommand。例:for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a
Bill_Stewart

@Bill_Stewartあなたは私の日を保存しました、しばらくの間、パイプされたコマンドの出力を変数に割り当てるのはずっと難しいと思いました
MrBrody

19

バッチファイルでデータベースクエリの結果が必要な場合の方法は次のとおりです。

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

キーは2行目にあります。「set / p」は、「<」リダイレクト演算子を使用して、「__ query.tmp」の「result」の値を最初の行(のみ)の値に設定します。


14

私がそれを見た唯一の方法は、あなたがこれをした場合です:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver Windowsのバージョンコマンドであり、私のシステムでは次のように生成されます。

Microsoft Windows [Version 6.0.6001]

ソース


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.