6

同じバッチ ファイル内の関数から値を返す方法は知っていますが、別のバッチ ファイルから値を返す際にいくつかの問題を発見しました。次に例を示します。

ファイル1.cmd

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

set number=1
call 2.cmd

echo. %number%

ENDLOCAL
exit /B

ファイル2.cmd

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

ENDLOCAL & set number=2
exit /B

出力はまだ 1 です。解決策はありますか?

4

2 に答える 2

7

LittleBobbyTables は正しい軌道に乗っていました。

2 つの SETLOCAL を使用して 1 つの ENDLOCAL のみを使用すると、変数が設定されますが、バッチが EXIT /B で終了するときに追加の暗黙の ENDLOCAL があるため、定義が失われます。バッチまたは関数が終了すると、すべての SETLOCAL が終了します。値を設定する前に、コードに ENDLOCAL を追加するだけです。

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

ENDLOCAL & ENDLOCAL & set number=2
exit /B

ただし、拡張機能はデフォルトで常に有効になっているため、enableExtensions が必要になることは非常にまれです。SETLOCAL ENABLEEXTENSIONS をドロップして、単一の ENDLOCAL を使用できるはずです。

なんらかの理由で本当に拡張機能を有効にする必要がある場合は、1 つの SETLOCAL で両方のオプションを使用でき、必要な ENDLOCAL は 1 つだけです。

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

ENDLOCAL & set number=2
exit /b
于 2012-08-18T14:31:53.183 に答える
2

I'm having a hard time explaining it properly, but the combination of both

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

in your 2.cmd file are causing a delay in the evaluation of the variable.

If either is individually enabled, %number% should still be set to 2, but together, %number% will be set to 1.

于 2012-08-18T12:46:36.553 に答える