В этой оболочке 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
Вы можете спросить: что еще вы пробовали?Хорошо:
- Удалены трюки
setlocal\endlocal
и только что использовалась глобальная %RESULT%
переменная - Явно не определены
%RESULT%
и %_RESULT_%
(например, set RESULT=
) перед каждымфункция называется
... все с одинаковыми результатами.Здесь что-то мне не хватает?