Если ELSE не выполняется, когда я запускаю командный файл - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу установить VAR2 и другие переменные, если VAR уже определен, на основе кода ниже:

@ECHO ON
SET ABC=IQ
SET VAR=value
ECHO %VAR%
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (
    ECHO Unable to enable extensions
)
IF DEFINED VAR (
    IF "%VAR%" == "code" call :Result
    IF "%VAR%" == "code2" call :Result
    IF "%VAR%" == "value" call :Result
    SET VAR2=C:\abc\files
) ELSE (
    SET VAR2=C:\abc\file\pic & ECHO VAR not defined
)
endlocal & SET VAR3=val
:Result
      SET NAME=CODE & SET VAR2=C:\abc\file

Когда я выполняю код выше, я получаю вывод:

SET ABC=IQ
SET VAR=valu
ECHO valu
valu
VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (ECHO Unable to enable extensions )
IF DEFINED VAR (
IF "valu" == "code" call :Result
 IF "valu" == "code2" call :Result
 IF "valu" == "value" call :Result
 SET VAR2=C:\abc\files
) ELSE (SET VAR2=C:\abc\file\pic & ECHO VAR not defined )
endlocal & SET VAR3=val
SET NAME=CODE & SET VAR2=C:\abc\file

НО, когда VAR не определен, даже чем: выполняется раздел RESULT. И также, когда VAR! = Значение, даже чем: выполняется раздел RESULT. Любые предложения, почему это так?

Ответы [ 2 ]

1 голос
/ 05 мая 2020
@ECHO ON
SET "ABC=IQ"
SET "VAR=value"
ECHO(%VAR%

VERIFY OTHER 2>nul

SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 (
    ECHO Unable to enable extensions
)

IF DEFINED VAR (
    IF "%VAR%" == "code" call :Result
    IF "%VAR%" == "code2" call :Result
    IF "%VAR%" == "value" call :Result
    SET "VAR2=C:\abc\files"
) ELSE (
    SET "VAR2=C:\abc\file\pic" & ECHO VAR not defined
)

rem Set VAR2, VAR3 and NAME outside the current local scope.
ENDLOCAL & (
    SET "VAR2=%VAR2%"
    SET "VAR3=val"
    SET "NAME=%NAME%"
)

rem Display variables set beginning with VAR and NAME.
SET VAR
SET NAME

rem End the code here to prevent continuing into the following label.
EXIT /B 0

:Result
    SET "NAME=CODE" & SET "VAR2=C:\abc\file"

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

VAR2 и VAR3 устанавливаются с тем же разобранным кодом, что и ENDLOCAL, поэтому они доступны в глобальном масштабе. Это работает, поскольку проанализированный код заменяет %VAR2% его значением до выполнения SETLOCAL и присвоения, выполняемого командами SET.

Добавлен EXIT /B 0 для завершения кода, так что :Result не выполняется в конце кода.

Вывод SET VAR:

VAR=value
VAR2=C:\abc\files
VAR3=val

Если VAR не определен путем удаления строки SET "VAR=value":

VAR2=C:\abc\file\pic
VAR3=val

Многие команды содержат справочную информацию, поэтому могут использовать command /?. Команда может быть примером set /?.

0 голосов
/ 01 мая 2020

Вы должны переместить свой блок :Result за пределы блоков if (чуть выше: например, END будет подходящим местом; просто поместите goto End перед блоком :Result, чтобы избежать нежелательного попадания в него). И затем call :Result не goto Result внутри блока if.
Для дальнейшей документации выполните call /? в командной строке (и, возможно, goto /? для справки). Это работает и со всеми другими командами, например, set /?, if /? и т. Д.

Поскольку я не вижу, где вы установите значение VAR, ваше текущее состояние if defined VAR всегда будет быть ложным Поэтому я думаю, что ваш сценарий нуждается в большей заботе, чем перемещение блока Result. Или это просто упрощенный пример, тогда не берите в голову;)
Возможно, поставьте echo %VAR% перед условием if для отладки и убедитесь, что есть значение.

Для целей отладки попробуйте @ECHO ON в первой строке. Это дает вам все шаги, которые выполняет ваш пакетный файл, и помогает находить ошибки.

Обновление после второго обновления кода:

Попробуйте такую ​​структуру:

[...]

goto eof
:Result
  ... your result block here
goto eof

[...]

:eof

С это защищает ваш: Result блок от выполнения, когда интерпретатор просто работает сверху вниз.
Также я бы предложил не использовать цепочки амперсандов (&). Предпочитайте одну команду в каждой строке, если это возможно.
Вы пропустили добавление всех символов %. Код, который вы разместили, просто не имеет никакого смысла без них.
Также кажется, что вы полностью удалили блок: Result, но вы все еще называете его ...
Я в замешательстве.

Пожалуйста, проверьте другие источники помощи, например, www.ss64.com (CMD) и некоторые учебные пособия. Я не буду обновлять свой ответ в другой раз, извините. Этот вопрос все равно был закрыт.

...