Как правильно проверить, является ли параметр пустым в командном файле? - PullRequest
186 голосов
/ 30 марта 2010

Мне нужно проверить, установлена ​​ли переменная или нет. Я пробовал несколько методов, но они, похоже, не работают, когда %1 окружен кавычками, например, когда %1 равен "c:\some path with spaces".

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

Согласно этому сайту , это поддерживаемые типы синтаксиса IF. Так что я не вижу способа сделать это.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

Ответы [ 16 ]

256 голосов
/ 30 марта 2010

Используйте квадратные скобки вместо кавычек:

IF [%1] == [] GOTO MyLabel

Круглые скобки небезопасны : используйте только квадратные скобки.

127 голосов
/ 30 марта 2010

Вы можете использовать:

IF "%~1" == "" GOTO MyLabel

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

32 голосов
/ 10 декабря 2011

Одно из лучших полу решений - скопировать %1 в переменную и затем использовать отложенное расширение, как delayedExp. всегда безопасен от любого контента.

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

Преимущество этого в том, что работа с param1 абсолютно безопасна.

И настройка param1 будет работать во многих случаях, например

test.bat hello"this is"a"test
test.bat you^&me

Но он потерпит неудачу со странным содержимым, таким как

test.bat "&"^&

Если вы хотите быть пуленепробиваемым на 99%, вы можете прочитать Как получить даже самые странные параметры командной строки?

16 голосов
/ 30 марта 2010

От IF /?:

Если расширения команд включены, ЕСЛИ изменяется следующим образом:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

ОПРЕДЕЛЕННАЯ условная работа просто как существует, за исключением того, что требуется имя переменной среды и возвращает истина, если переменная среды определены.

6 голосов
/ 24 июля 2018

К сожалению, у меня недостаточно репутации, чтобы комментировать или голосовать за текущие ответы, мне пришлось написать свои собственные.

Первоначально вопрос ОП гласил «переменная», а не «параметр», что очень запутало, тем более что это была ссылка номер один в Google для поиска, как проверить пустые переменные. После моего первоначального ответа Стефан отредактировал исходный вопрос, чтобы использовать правильную терминологию, но вместо того, чтобы удалить свой ответ, я решил оставить его, чтобы прояснить любую путаницу, особенно в случае, если Google все еще отправляет сюда людей для переменных: *

% 1 НЕ ПЕРЕМЕННО! ЭТО ПАРАМЕТР КОМАНДНОЙ ЛИНИИ.

Очень важное различие. Один знак процента с числом после него относится к параметру командной строки, а не к переменной.

Переменные устанавливаются с помощью команды set и вызываются с использованием 2-процентных знаков - один до и один после. Например% myvar%

Чтобы проверить пустую переменную, вы используете синтаксис «если не определен» (команды явно для переменных не требуют знаков процента), например:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(Если вы хотите проверить параметры командной строки, тогда я рекомендую обратиться к ответу jamesdlin.)

6 голосов
/ 13 августа 2014

Используйте «IF DEFINED variable command» для проверки переменной в командном файле.

Но если вы хотите проверить параметры пакета, попробуйте следующие коды, чтобы избежать хитрого ввода (например, «1 2» или ab ^> cd)

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)
3 голосов
/ 06 марта 2018

Я тестирую с кодом ниже, и это нормально.

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)
3 голосов
/ 26 апреля 2017

Вы можете использовать

if defined (variable) echo That's defined!
if not defined (variable) echo Nope. Undefined.
3 голосов
/ 04 октября 2016

Пустая строка - это пара double-quotes / "", мы можем просто проверить длину:

set ARG=%1
if not defined ARG goto nomore

set CHAR=%ARG:~2,1%
if defined CHAR goto goon

, затем протестируйте 2 символа против double-quotes:

if ^%ARG:~1,1% == ^" if ^%ARG:~0,1% == ^" goto blank
::else
goto goon

Вот пакетный скрипт, с которым вы можете играть. Я думаю, что это правильно ловит пустую строку.

Это всего лишь пример, вам просто нужно настроить 2 (или 3?) Шага выше в соответствии с вашим сценарием.

@echo off
if not "%OS%"=="Windows_NT" goto EOF
:: I guess we need enableExtensions, CMIIW
setLocal enableExtensions
set i=0
set script=%0

:LOOP
set /a i=%i%+1

set A1=%1
if not defined A1 goto nomore

:: Assumption:
:: Empty string is (exactly) a pair of double-quotes ("")

:: Step out if str length is more than 2
set C3=%A1:~2,1%
if defined C3 goto goon

:: Check the first and second char for double-quotes
:: Any characters will do fine since we test it *literally*
if ^%A1:~1,1% == ^" if ^%A1:~0,1% == ^" goto blank
goto goon

:goon
echo.args[%i%]: [%1]
shift
goto LOOP

:blank
echo.args[%i%]: [%1] is empty string
shift
goto LOOP

:nomore
echo.
echo.command line:
echo.%script% %*

:EOF

Результат теста на пытку:

.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
args[1]: [::]
args[2]: [""] is empty string
args[3]: [">"""bl" "]
args[4]: ["< "">"]
args[5]: [(")(")]
args[6]: [""] is empty string
args[7]: [::]
args[8]: [""-"  "]
args[9]: ["( )"">\>"]
args[10]: [""] is empty string

command line:
.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
3 голосов
/ 30 марта 2010

Я обычно использую это:

IF "%1."=="." GOTO MyLabel

Если% 1 пуст, IF сравнивает "." к "." который оценит как истинное.

...