Мне нужно проверить, установлена ли переменная или нет. Я пробовал несколько методов, но они, кажется, терпят неудачу всякий раз, когда %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
windows
shell
batch-file
cmd
blak3r
источник
источник
if "%1" == "" GOTO MyLabel
не приводит к смертельному завершению выполнения скрипта, если в нем%1
есть четное число двойных кавычек. Я вижу, что нечетное число двойных кавычек%1
убивает выполнение скрипта с этой ошибкой:The syntax of the command is incorrect.
Решение ниже, которое использует квадратные скобки для решения проблемы, было помечено как правильный ответ, но это, кажется, не делает лучше , Это решение также терпит неудачу с той же ошибкой, когда%1
имеет нечетное число двойных кавычек.IF DEFINED
только работа с переменными окружения вместо скриптовых переменных - такая трата потенциала!Ответы:
Используйте квадратные скобки вместо кавычек:
Скобки небезопасны : используйте только квадратные скобки.
источник
&
in%1
сломает чертуif #%1#==##
илиif [%1]==[]
хорошо, если в аргументе нет пробелов, в противном случае вы получите…was unexpected at this time
ошибку."%~1"
действительно лучший подход, как я уже упоминал в своем ответе.==
. Вместо этого используйте его ответ.it DOES NOT work with spaces
. Вместо этого используйте ответ @jamesdlin.Ты можешь использовать:
раздеть внешний набор цитат. В целом, это более надежный метод, чем использование квадратных скобок, поскольку он будет работать, даже если в переменной есть пробелы.
источник
~
, вы удаляете внешние кавычки, если они присутствуют, но затем добавляете их обратно вручную (обеспечивая только один набор). Кроме того, вы должны использовать кавычки , если аргумент содержит пробелы (я это узнал , трудный путь , когда моя предыдущая версия использования#
или скобки вместо кавычек , вызванные аргументы с пробелами , чтобы бросить…was unexpected at this time
ошибку.)""this string will crash the comparison""
Double '"' - правильная escape-последовательность, и выполнение замены на double '"' завершится неудачно, если строка пуста."%~1"
.Одним из лучших полу решений является копирование
%1
в переменную, а затем использование отложенного расширения, как delayedExp. всегда безопасен от любого контента.Преимущество этого в том, что работа с param1 абсолютно безопасна.
И настройка param1 будет работать во многих случаях, например,
Но это все еще терпит неудачу со странным содержанием как
Чтобы иметь возможность получить 100% правильный ответ за существование
Он обнаруживает, если
%1
он пуст, но для некоторого контента он не может извлечь контент.Это также может быть полезно для различения пустого
%1
и одного с""
.Он использует возможность
CALL
команды завершиться с ошибкой без прерывания командного файла.Если вы хотите быть на 100% пуленепробиваемыми для извлечения контента, вы можете прочитать Как получить даже самые странные параметры командной строки?
источник
От IF / ?:
источник
%1
лайков. «Переменные, определенные внутри пакетного файла» на самом деле являются переменными среды, в которых запущен пакетный файл, и вы можете использоватьIF DEFINED
их.К сожалению, у меня недостаточно репутации, чтобы комментировать или голосовать за текущие ответы, поэтому я должен был написать свой собственный.
Первоначально вопрос ОП гласил «переменная», а не «параметр», что очень сбивало с толку, тем более что это была ссылка номер один в Google для поиска способов проверки на наличие пустых переменных. Начиная с моего первоначального ответа, Стефан отредактировал исходный вопрос, чтобы использовать правильную терминологию, но вместо того, чтобы удалить свой ответ, я решил оставить его, чтобы прояснить любую путаницу, особенно в случае, если Google все еще отправляет сюда людей для переменных:
% 1 НЕ ПЕРЕМЕННЫЙ! ЭТО ПАРАМЕТР КОМАНДНОЙ ЛИНИИ.
Очень важное различие. Один знак процента с числом после него относится к параметру командной строки, а не к переменной.
Переменные устанавливаются с помощью команды set и вызываются с использованием 2-процентных знаков - один до и один после. Например% myvar%
Чтобы проверить пустую переменную, вы используете синтаксис «если не определен» (команды явно для переменных не требуют никаких знаков процента), например:
(Если вы хотите проверить параметры командной строки, то я рекомендую обратиться к ответу jamesdlin.)
источник
if variable is empty
доif parameter is empty
. Я только что это сделал. (рискуя лишить законной силы некоторые ответы, которые проверяли переменные вместо параметров и поэтому в любом случае были недействительными, поскольку они не ответили на вопрос)Используйте «IF DEFINED variable command» для проверки переменной в командном файле.
Но если вы хотите проверить параметры пакета, попробуйте коды ниже, чтобы избежать хитрого ввода (например, «1 2» или ab ^> cd)
источник
Я тестирую с кодом ниже, и это нормально.
источник
IF DEFINED var
по причинеЯ обычно использую это:
Если% 1 пусто, IF будет сравнивать "." к "." который оценит как истину.
источник
Я создал этот небольшой пакетный скрипт на основе ответов здесь, так как есть много действительных. Не стесняйтесь добавлять к этому, если вы придерживаетесь того же формата:
источник
Пустая строка - это пара
double-quotes
/""
, мы можем просто проверить длину:затем протестируйте 2 символа против
double-quotes
:Вот пакетный скрипт, с которым вы можете играть. Я думаю, что это правильно ловит пустую строку.
Это всего лишь пример, вам просто нужно настроить 2 (или 3?) Шага выше в соответствии с вашим сценарием.
Этот результат теста на пытки:
источник
""
, пустая строка является пустой строкой ``, а в пакете пустая переменная является неопределенной переменной. Вы можете определить, что для ваших аргументов внешние кавычки будут удалены, но тогда строка все еще пуста с длиной 0""
они также используются для пустых строк, но их довольно просто%~1
удалить из внешних кавычек. нет необходимости использовать такое сложное решение"%~1"==""
, потерпят неудачу с аргументом,"Long File Name".txt
который является допустимым аргументом. редактировать : И это определенно не сложно, как вы сказали. Только 2 шага выше для теста, остальные подробный пример.Ты можешь использовать
источник
Сценарий 1:
Ввод («Удалить цитаты. Cmd» «Это тест»)
Вывод (нет ни одного,% 1 не был пустым, пустым или пустым):
Выполнить ("Удалить Quotes.cmd") без каких-либо параметров с вышеупомянутым скриптом 1
Вывод (% 1 пусто, пусто или NULL):
Примечание. Если вы установите переменную внутри
IF ( ) ELSE ( )
оператора, она не будет доступна для DEFINED до тех пор, пока она не выйдет из оператора «IF» (если только «Delayed Variable Expansion» не включен; после включения используйте восклицательный знак «!» Вместо символ процента "%"}.Например:
Сценарий 2:
Ввод («Удалить цитаты. Cmd» «Это тест»)
Вывод:
Примечание: он также удалит кавычки внутри строки.
Например (используя сценарий 1 или 2): C: \ Users \ Test \ Documents \ Batch Files> "Удалить Quotes.cmd" "Это" a "Тест"
Вывод (сценарий 2):
Выполнить («Удалить Quotes.cmd») без каких-либо параметров в сценарии 2:
Вывод:
источник
Подводя итог:
Этот код выведет «Пустую строку», если% 1 либо «», либо «или пусто. Добавил его в принятый ответ, который в настоящее время неверен.
источник
У меня было много вопросов с большим количеством ответов в сети. Большинство работает для большинства вещей, но всегда есть угловой случай, который ломает каждый.
Может быть, он не работает, если у него есть кавычки, может быть, он ломается, если у него нет кавычек, синтаксическая ошибка, если у переменной есть пробел, некоторые будут работать только с параметрами (в отличие от переменных окружения), другие методы допускают пустое набор кавычек, которые нужно передать как «определенные», а некоторые хитрые не позволят вам зацепить
else
потом.Вот решение, которым я доволен, пожалуйста, дайте мне знать, если вы найдете угловой корпус, для которого он не будет работать.
Наличие этой подпрограммы либо в вашем скрипте, либо в его собственном
.bat
, должно работать.Итак, если вы хотите написать (псевдо):
Ты можешь написать:
Это сработало для всех моих тестов:
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)
источник
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
, вторитtrue
иfalse
ifSet
ее самостоятельно, а затемIf %errorlevel% EQU 0 (x) Else (y)
set
переменных (например[%bob%]
, работает только для аргументов[%2]
), но теперь перепроверка работает. Думаю, единственное, что мне[]
сейчас не нравится, это то, что он пропускает пустые кавычки, тогда как это не так (на самом деле это зависит от вашего/B
Флаг останавливает всю партию от выхода, только выход из подпрограммы илиcall
«D партии. Если вы не спросите, что делает вся команда ; он возвращает код ошибки, чтобы позволить вызывающему сценарию узнать результат подпрограммы (0
pass,1
fail), которую можно использовать с помощью логической логики в ответе или%errorlevel%
в комментариях вышеС помощью ! вместо "для проверки пустой строки
источник
Я вошел чуть меньше месяца назад (хотя об этом спросили 8 лет назад) ... Я надеюсь, что он / она уже перешел за пределы пакетных файлов. ;-) Я делал это все время. Я не уверен, какова конечная цель, хотя. Если он / она ленив, как я, мой go.bat работает на такие вещи. (См. Ниже) Но, 1, команда в OP может быть недействительной, если вы непосредственно используете ввод как команду. т.е.
является неверной командой (или использовалась, если вы были на другом диске). Вам нужно разбить его на две части.
И, 2, что означает «определенный» или «неопределенный»? GIGO. Я использую по умолчанию, чтобы ловить ошибки. Если ввод не перехватывается, он падает, чтобы помочь (или команда по умолчанию). Итак, без ввода не ошибка. Вы можете попробовать перейти на вход и поймать ошибку, если она есть. (Хорошо, использование загрузок go (только один пользователь) перехватывается DOS. (Сурово!))
И, 3, кавычки нужны только вокруг пути, а не команды. т.е.
было плохо (или раньше), если только вы не были на другом диске.
функционально
работает, если у вас есть пробелы на вашем пути.
источник
cd
«S/d
переключатель:cd /d "C:\Users\Me" (and the proper path delimeter for Windows is
` не/
).