2009-11-06 22 views
10

setはバッチファイルでは機能しませんでした。問題を解決するのに時間がかかりました。最初に私がDOSバッチ:SET変数とECHOブロック内(...)ブロック

a = "aaa" 
b = "bbb" 

なぜを期待するのに対し、スクリプト

@echo off 
setlocal 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "%b%" 
) 

が出力

a = "aaa" 
b = "" 

を生成

...それはサブルーチン呼び出しで行うことだと思いましたこれはどうですか? DOSのバグですか?おそらく、私が気付いていないコマンド群の構文である(...)に関する何かがあります。

ありがとうございました。

答えて

10

ユーザー遅延拡張と! %012の代わりに

@echo off 
setlocal enableextensions enabledelayedexpansion 
set a=aaa 
echo a = "%a%" 
(
set b=bbb 
echo b = "!b!" 
) 
+0

簡潔な返信ありがとうございます。番号付きのパラメータ%1などの構文があるかどうか知りますか?私は!1と!1!を試しましたが、これらは動作しません。 (私は:サブルーチン呼び出しのコンテキストでこれを求めています。) – Rhubbarb

+1

%a%型変数の構文と実行の間で変更できないので、重要であることがわかりません。 –

+0

あなたは大丈夫です。スクリプトには他にも問題があり、同じ症状を示しました。問題が解決しました。非常に(すべてに)ありがとう。 – Rhubbarb

6

遅延拡張がオンになっている必要があります。または、バッチインタプリタは、実行時ではなく解析時にすべての変数を補間します。

setlocal enableextensions enabledelayedexpansion 

例とその説明については、this questionを参照してください。

7

何が起こっているのかは、ブラケットの間のすべてを1行で処理するバッチインタプリタです。これは、コマンドの実行前にブラケット間のすべての変数を置換していることを意味します。だから、

(
set b=bbb 
echo b = "%b%" 
) 

は次のようになります。

(
set b=bbb 
echo b = "" 
) 

変数bが設定されているが、明らかにあなたはSETコマンドを実行する前に設定されていません。

関連する問題