2

stackoverflowに関する既存の投稿を読み、ネット上でいくつかの読み物を行いました。髪を失いすぎる前に、質問を投稿する時が来たと思いました!

Windows XP SP3 で、ダブルクリックして実行するバッチ ファイル内に次のコードがあります。

SETLOCAL ENABLEDELAYEDEXPANSION

::Observe variable is not defined
SET test

::Define initial value
SET test = "Two"

::Observe initial value is set
SET test

::Verify if the contents of the variable matches our condition
If "!test!" == "Two" GOTO TWO

::First Place holder
:ONE

::Echo first response
ECHO "One"

::Second Place holder
:TWO

::Echo second response
ECHO "Two"

::Await user input
PAUSE

ENDLOCAL

基本的に、条件を使用してスクリプトをナビゲートできるかどうかを確認しようとしています。変数のスコープと変数の展開の遅延に関するいくつかの問題が発生していることは明らかですが、私が間違っていることについて少し迷っています。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

5

当面の問題は、変数を値 < "Two"> に設定していることです。これはここで確認できます。

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

::Observe variable is not defined
SET test

::Define initial value
SET test = "Two"

::Observe initial value is set
SET test
echo %test%
echo..%test %.

::Verify if the contents of the variable matches our condition
If "!test!" == "Two" GOTO TWO

::First Place holder
:ONE

::Echo first response
ECHO "One"

::Second Place holder
:TWO

::Echo second response
ECHO "Two"

::Await user input
PAUSE

ENDLOCAL

これは以下を生成します:

Environment variable test not defined
test = "Two"
. "Two".
"One"
"Two"
Press any key to continue . . .

「set test」が変数を出力している理由は、「set t」が出力するのと同じ理由です。特定の名前の変数がない場合、その名前で始まるすべての変数を出力します。

set コマンドも気難しい小さな獣で、'=' 文字を囲むスペースが好きではありません。それら(および引用符)を環境変数名とそれに割り当てられた値に組み込みます。代わりに、次を使用します。

set test=Two

また、遅延展開を使用している場合は、%test% と !test! 同じように展開します。次のようなステートメントで役立ちます。

if "!test!" == "Two" (
    set test=TwoAndABit
    echo !test!
)

内部エコーは TwoAndABit を出力しますが、%test% は、if ステートメント全体が検出されたときに展開され、Two を出力します。

それでも、一貫性を保つために、私は常にどこでも遅延拡張を使用しています。

于 2008-12-15T11:31:25.470 に答える
0

SET コマンドは、等号の後の最後の非ブランク文字まですべてを取得します。あなたの命令...

SET test = "Two"

...変数 test を値「Two」に設定し、文字列 Two だけでなく、先頭に空白と引用符を付けます。

だから、テストすると...

If "!test!" == "Two" GOTO TWO

あなたは本当にテストしています...

If " "Two"" == "Two" GOTO TWO
于 2009-04-10T19:07:18.283 に答える