Вызов внутренней «функции» в сценарии CMD без обновления переменной - PullRequest
1 голос
/ 24 января 2012

В этой оболочке NT cmd \ "batch file", которую я на днях собрал вместе, я использую команду call для запуска разделов скрипта как функции - какЯ делал много раз в других сценариях.Но одна из них ведет себя странно, и я не могу понять, что может быть не так ...

Проблема в том, что при первом вызове функции она правильно возвращает код ошибки и устанавливает (глобальную) переменную%RESULT%, но каждый раз, когда он вызывается снова, он не может обновить переменную с новым кодом ошибки.

Вот сокращенная версия рассматриваемого кода:

:FACL
REM run fileacl.exe with given OPTIONS (%1)
REM uses global variables %TARGET% and %LOGPATH%, sets global %RESULT%
setlocal
set _OPTIONS_=%*
fileacl.exe "%TARGET%" %_OPTIONS_% /SILENT >%LOGPATH%\temp.out 2>%LOGPATH%\temp.err
set _RESULT_=%ERRORLEVEL%
if defined DEBUG echo INSIDE FUNCTION: _RESULT_ = %_RESULT_%
endlocal & set RESULT=%_RESULT_% & goto :EOF

функция вызывается в таких строках:

call :FACL /LINE
if defined DEBUG echo AFTER TEST #1: RESULT = %RESULT%
...
call :FACL /INHERIT /REPLACE /FORCE
if defined DEBUG echo AFTER FIX #2: RESULT = %RESULT%

Вы видите эти if defined DEBUG... строки там?Они показывают мне, что внутри функции последующие вызовы завершаются успешно и, таким образом, выводятся ожидаемые %_RESULT_% из 0, но глобальный %RESULT% остается прежним.Вот пример выходных данных:

TEST #1:
INSIDE FUNCTION: _RESULT_ = 107  <-- that's what I expect for the first call
AFTER TEST #1: RESULT = 107      <-- the variable was properly set after the first call

FIX #2:
INSIDE FUNCTION: _RESULT_ = 0    <-- command succeeded :)
AFTER FIX #2: RESULT = 107       <-- variable didn't change :(

RETEST:
INSIDE FUNCTION: _RESULT_ = 0    <-- succeeded again
AFTER RETEST: RESULT = 107       <-- still didn't change

Вы можете спросить: что еще вы пробовали?Хорошо:

  1. Удалены трюки setlocal\endlocal и только что использовалась глобальная %RESULT% переменная
  2. Явно не определены %RESULT% и %_RESULT_% (например, set RESULT=) перед каждымфункция называется

... все с одинаковыми результатами.Здесь что-то мне не хватает?

1 Ответ

4 голосов
/ 24 января 2012

Не могу быть уверен, потому что мы не можем увидеть фактический код в контексте. Но поведение, которое вы описываете, следует ожидать, если FIX 2 CALL и ECHO находятся внутри блока в скобках - возможно, как часть оператора IF или цикла FOR.

Если это так, то вам нужно использовать отложенное раскрытие в скобках, так как весь блок анализируется перед выполнением, а% RESULT% раскрывается во время разбора.

Используйте SET EnableDelayedExpansion, чтобы включить отложенное расширение, и используйте !RESULT! вместо %RESULT%, чтобы получить значение RESULT во время выполнения, а не во время разбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...