2017-02-11 7 views
1

В чем разница между пустой строкой и ни одной созданной переменной в пакетном файле? , и если у них есть что-то другое, можете ли вы показать мне пример использования пустой строки vs none created string?В чем разница между пустой строкой и ни одной созданной переменной

@echo off 
title Empty String Vs None Created Variable 
set String= 
set variable=exist 
if [%String%] == [] echo its be a Empty String 
if [%variable%] == [] echo its be a Empty String 
if [%none_exist_var%] == [] echo its be a Empty String 

Большое спасибо!

+0

Там нет никакого способа определить переменную с пустой строкой в ​​пакетном режиме. 'set" var = "' command _deletes_ переменная. – Aacini

+0

@Aacini можно [установить переменную в null] (https://en.wikipedia.org/wiki/Batch_file#Null_values_in_variables). Вот почему вам нужны кавычки или какой-либо другой текст при сравнении в 'if', иначе' if% var% == text' может выйти из строя, если '% var%' ничего не содержит. [Как установить/использовать пустое строковое значение в переменной] (http://superuser.com/q/689847/241386) –

+0

@ LưuVĩnhPhúc: Связанная статья Википедии не ясна. Как я уже говорил, ** нет способа определить переменную с пустой строкой в ​​Batch **. Я приглашаю вас проверить эту команду: 'if defined var echo Value ="% var% "' и сообщить, когда вы получите этот результат: 'Value =" "' – Aacini

ответ

2

Переменные в пакетных файлах могут быть

  • Определено: есть значение, которое хранится и связано имя, используемое для получения значения, то есть, имя переменной.
  • Undefined: нет никакой ценности, и в этом случае нет необходимости в ассоциированном имени, поэтому его не существует.

Эти два простых правила описывают, как обновляется блок среды (где хранятся переменные/значение). Если есть значение, блок среды имеет запись для значения и имя для его получения. Без значения блок среды не создает запись или, когда переменная не указана, запись удаляется.

Так что, если

  • никогда не определяются переменный не любая запись в среде блока
  • переменной с не значение не имеет никакой записи в блоке среды

нет любая разница между этими двумя случаями.

примечание: В то время как традиционный способ проверить, если переменная хранит значение/переменная существует является (, как dbenham прокомментировал, что этот синтаксис не рекомендуется ставить в кавычки внутри значения приводят переменную к синтаксису проблемы)

if "%varName%"=="" .... 

, если расширения командного процессора разрешены (и конфигурация по умолчанию, чтобы они включены) вы также можете использовать более безопасный альтернативный

if not defined varName .... 
if defined varName .... 

обратите внимание, что в этом синтаксисе, так как мы не пытаемся прочитать значение переменной, используется varName, не %varName%

+1

Я бы использовал «традиционный» или «исторический» вместо «обычного». Синтаксис 'if"% varname% "==" "может завершиться неудачно, если значение содержит свои собственные кавычки. Это основная причина, по которой был создан синтаксис 'if defined varName' - он всегда преуспевает независимо от значения. 'if '% varName%" == "" 'следует избегать. – dbenham

+0

@dbenham, я использовал * обычный * в смысле того, что я обычно вижу в опубликованном коде, что я вижу как * привычный *. Я знаю проблемы, связанные с этим использованием. В любом случае, мне нравится предложенный * традиционный * термин, спасибо. Ответ обновлен. –

+0

Да, я понял ваше использование «обычного», и это было не так. Но мне больше нравится ваша отредактированная версия :-) – dbenham

1

Нет никакой разницы. Читайте Delete a variable:

Тип SET только с именем переменной и знак равенства:

SET _department= 

еще лучше, чтобы быть уверенным, что нет трейлинг пространства после = место выражение в скобках или кавычках :

(SET _department=) 

или

SET "_department="