Как правильно проверить, является ли параметр пустым в командном файле? - 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 ]

2 голосов
/ 11 января 2017

Подводя итог:

set str=%~1
if not defined str ( echo Empty string )

Этот код выведет «Пустую строку», если% 1 либо «», либо «или пусто. Добавил его в принятый ответ, который в настоящее время неверен.

2 голосов
/ 14 сентября 2016

Я создал этот небольшой пакетный скрипт на основе ответов здесь, так как есть много действительных. Не стесняйтесь добавлять к этому, если вы придерживаетесь того же формата:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause
2 голосов
/ 03 марта 2011

Сценарий 1:

Input («Remove Quotes.cmd» «Это тест»)

@ECHO OFF

REM Set "string" variable to "first" command line parameter
SET STRING=%1

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

REM IF %1 [or String] is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel


REM   OR   IF "." equals "." GOTO MyLabel
IF "%STRING%." == "." GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

PAUSE

Вывод (нет,% 1 не был пустым, пустым или пустым):


Выполнить ("Удалить Quotes.cmd") без каких-либо параметров с помощью вышеуказанного скрипта 1

Вывод (% 1 пусто, пусто или NULL):

Welcome!

Press any key to continue . . .

Примечание. Если вы установите переменную в операторе IF ( ) ELSE ( ), она не будет доступна для DEFINED до тех пор, пока она не выйдет из оператора «IF» (если только «Delayed Variable Expansion» не включено; после включения используйте восклицательный знак » ! "вместо символа процента"% "}.

Например:

Сценарий 2:

Input («Remove Quotes.cmd» «Это тест»)

@ECHO OFF

SETLOCAL EnableDelayedExpansion

SET STRING=%0
IF 1==1 (
  SET STRING=%1
  ECHO String in IF Statement='%STRING%'
  ECHO String in IF Statement [delayed expansion]='!STRING!'
) 

ECHO String out of IF Statement='%STRING%'

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

ECHO String without Quotes=%STRING% 

REM IF %1 is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

ENDLOCAL
PAUSE

Вывод:

C:\Users\Test>"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" "This is a Test"  
String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is a Test"'  
String out of IF Statement='"This is a Test"'  
String without Quotes=This is a Test  

C:\Users\Test>  

Примечание: он также удалит кавычки из строки.

Например (используя скрипт 1 или 2): C: \ Users \ Test \ Documents \ Batch Files> "Удалить Quotes.cmd" "Это" a "Тест"

Вывод (сценарий 2):

String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is "a" Test"'  
String out of IF Statement='"This is "a" Test"'  
String without Quotes=This is a Test  

Выполнить («Удалить Quotes.cmd») без каких-либо параметров в сценарии 2:

Выход:

Welcome!

Press any key to continue . . .
0 голосов
/ 03 апреля 2018

Я вошел чуть меньше месяца назад (хотя об этом спросили 8 лет назад) ... Я надеюсь, что он / она уже вышел за пределы пакетных файлов. ;-) Я делал это все время. Я не уверен, какова конечная цель, хотя. Если он / она ленив, как я, мой go.bat работает на такие вещи. (Увидеть ниже) Но, 1, команда в OP может быть недействительной, если вы непосредственно используете ввод как команду. т.е.

"C:/Users/Me"

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

C:
cd /Users/Me

И, 2, что означает «определенный» или «неопределенный»? GIGO. Я использую по умолчанию, чтобы ловить ошибки. Если ввод не перехватывается, он падает, чтобы помочь (или команда по умолчанию). Итак, без ввода не ошибка. Вы можете попробовать перейти на вход и поймать ошибку, если она есть. (Хорошо, использование загрузок go (только один пользователь) перехватывается DOS. (Резко!))

cd "%1"
if %errorlevel% neq 0 goto :error

И, 3, кавычки нужны только вокруг пути, а не команды. то есть

"cd C:\Users" 

было плохо (или раньше), если вы не были на другом диске.

cd "\Users" 

является функциональным.

cd "\Users\Dr Whos infinite storage space"

работает, если на вашем пути есть пробелы.

@REM go.bat
@REM The @ sigh prevents echo on the current command
@REM The echo on/off turns on/off the echo command. Turn on for debugging
@REM You can't see this.
@echo off
if "help" == "%1" goto :help

if "c" == "%1" C:
if "c" == "%1" goto :done

if "d" == "%1" D:
if "d" == "%1" goto :done

if "home"=="%1" %homedrive%
if "home"=="%1" cd %homepath%
if "home"=="%1" if %errorlevel% neq 0 goto :error
if "home"=="%1" goto :done

if "docs" == "%1" goto :docs

@REM goto :help
echo Default command
cd %1
if %errorlevel% neq 0 goto :error
goto :done

:help
echo "Type go and a code for a location/directory
echo For example
echo go D
echo will change disks (D:)
echo go home
echo will change directories to the users home directory (%homepath%)
echo go pictures
echo will change directories to %homepath%\pictures
echo Notes
echo @ sigh prevents echo on the current command
echo The echo on/off turns on/off the echo command. Turn on for debugging
echo Paths (only) with folder names with spaces need to be inclosed in         quotes (not the ommand)
goto :done

:docs
echo executing "%homedrive%%homepath%\Documents"
%homedrive%
cd "%homepath%\Documents"\test error\
if %errorlevel% neq 0 goto :error
goto :done

:error
echo Error: Input (%1 %2 %3 %4 %5 %6 %7 %8 %9) or command is invalid
echo go help for help
goto :done

:done
0 голосов
/ 15 февраля 2017

Использование! вместо "для проверки пустой строки

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty
0 голосов
/ 03 августа 2016

У меня было много вопросов с большим количеством ответов в сети. Большинство работает для большинства вещей, но всегда есть угловой случай, который ломает каждый.
Может быть, он не работает, если у него есть кавычки, может быть, он ломается, если у него нет кавычек, синтаксическая ошибка, если у переменной есть пробел, некоторые будут работать только с параметрами (в отличие от переменных окружения), другие методы допускают пустое набор кавычек, которые нужно передать как «определенные», а некоторые хитрые не позволят вам зачеркнуть else впоследствии.

Вот решение, которым я доволен, пожалуйста, дайте мне знать, если найдете угловой шкаф, для которого он не подойдет.

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

Наличие этой подпрограммы либо в вашем скрипте, либо в его собственном .bat должно работать.
Итак, если вы хотите написать (псевдо):

if (var)
then something
else somethingElse

Вы можете написать:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)

Это сработало для всех моих тестов:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

Echo'd n, y, n, y, y


Дополнительные примеры:

  • Хотите просто проверить if? Call :ifSet %var% && Echo set
  • Просто если нет (только остальное)? Call :ifSet %var% || Echo set
  • Проверка переданного аргумента; работает отлично. Call :ifSet %1 && Echo set
  • Не хотите засорять ваши скрипты / дублирующий код, поэтому вы поместили его в его собственный ifSet.bat? Нет проблем: ((Call ifSet.bat %var%) && Echo set) || (Echo not set)
...