Проблема пустой переменной с использованием набора в Windows Batch - PullRequest
7 голосов
/ 25 июня 2011
set var=%1
echo var
set command=""
IF var==true ( 
    set command=dir
)

IF var==false ( 
    set command=dir /a
)
echo %command%
%command%

Итак, если я запускаю этот скрипт, набрав

C:\>test true

echo %command% всегда печатает "". Есть идеи?

Ответы [ 2 ]

11 голосов
/ 25 июня 2011

Вам не хватает некоторых % знаков, необходимых для разыменования любой переменной.

Вы, вероятно, хотите это так:

set var=%1
echo %var%
set command=""
IF %var%==true (                    <=== here
    set command=dir
)

IF %var%==false (                   <=== here
    set command=dir /a
)
echo %command%
%command%

Вы должны также окружать свои сравнения строк кавычками, чтобы учесть пробелы, что-то вроде этого:

IF "%var%"=="false"

Кроме того, как указал Джои, очистка переменной выполняется с помощью

set command=

без кавычек. В противном случае вы будете инициализировать переменную этими кавычками, что приведет к вашему странному выводу.

3 голосов
/ 27 ноября 2014

Я выкопал, что переменная пуста, если вы используете условия и задали условия!

if errorlevel 0 (
   Set localVar="fooBar"
   echo "%localVar%"
)

приведет к пустому выводу!

относится к сравнению строк в командном файле использовать

SetLocal EnableDelayedExpansion

для включения !VARNAME!, что позволит использовать !VARNAME! в условии ниже, но все равно не разрешит вывод для %VARNAME% в условном блоке!

Используйте Set BEFORE для условия, чтобы сделать его доступным в условном блоке. ИЛИ использование должно быть ПОСЛЕ условного блока, в котором был использован Set.

(!) В настоящее время я не знаю, как проверить использование Set AND в одном блоке!

См. Пример кода в https://gist.github.com/childnode/0f6c874ad79788a86332

(!) Но, как вы можете видеть из результатов (также в гисте), использование DelayedExpansion имеет другой побочный эффект:

Переменная устанавливается во втором запуске в той же оболочке (что, очевидно, правильно), но по некоторым причинам не устанавливается с EnableDelayedExpansion во втором запуске (кажется, она также очищает «локальные» переменные из скрипта и не экспортирует это для следующих команд! Это может вызвать другую ошибку, если в «трубе» запускаются разные командные файлы

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