6

Использование SET для установки пустого значения переменной прекрасно работает в Windows XP.CMD скрипт. Однако одна и та же команда SET ведет себя по-разному в одном и том же интерпретаторе CMD при использовании непосредственно из командной строки:

Попытка проверить это в командной строке CMD.EXE:

C:\>set Q=

C:\>echo %Q%
%Q%

C:\>echo "%Q%"
"%Q%"

C:\>set Q=/Q

C:\>echo %Q%
/Q

C:\>echo "%Q%"
"/Q"

Попытка проверить это с.Сценарий CMD, как это:

set Q=
echo %Q%
echo "%Q%"
set Q=/Q
echo %Q%
echo "%Q%"

Запуск это:

C:\>c.cmd

C:\>set Q=

C:\>echo
ECHO is on.

C:\>echo ""
""

C:\>set Q=/Q

C:\>echo /Q
/Q

C:\>echo "/Q"
"/Q"

Что мне не хватает?

Это хорошая шутка от Редмонда, или есть какое-то вменяемое объяснение этой разницы?

Как я должен проверить строки из.Сценарий CMD, когда они ведут себя по-разному при использовании в командной строке?

Как правильно установить для переменной значение пустой строки в командной строке CMD и как мне ссылаться на эту переменную, чтобы получить эту пустую строку?

4 ответа4

4

tl; dr - проблема в том, что echo %Q% расширяется до echo . Используйте echo.%Q%

Расширенный ответ

Команда echo получила 4 поведения:

  • echo on - включает отображение команд
  • echo off - отключает отображение команд
  • echo - показывает состояние опции отображаемых команд.
  • echo ... - ставит ... и новую строку на экране.

Если вы передадите переменную в качестве аргумента echo, и она будет пустой, она расширится до echo и покажет что-то вроде «ECHO выключен».

Многие люди используют echo. команда для отображения пустой строки (читай: вывод новой строки), но не все знают, что echo. может быть использован, чтобы явно указать, что вы хотите выходного поведения. например:

  • echo.on - выведет on и новую строку
  • echo.off - выведет off и перевод строки
  • echo. - выведет новую строку
  • echo.something - выведет something и перевод строки
  • echo.%Q% - будет выводить содержимое %Q% независимо от того, включено ли оно ""/"включено"/"выключено" или что-то еще.

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

См. Https://technet.microsoft.com/en-us/library/bb490897.aspx?f=255&MSPPError=-2147217396

2

В то время как вы можете проверить, пуст ли или не переменная, если вы хотите соединить переменную в строку с поддержкой пустых / нулевых значений, возможный обходной путь будет префиксом все значения с фиктивным характером, и пропустить этот символ всегда , когда вы используете эту переменную:

set q=0
set q2=%q:~1%string

тестовое задание:

set q=0_
echo %q%
echo %q:~1%concat%q:~1%

set q=0
echo %q%
echo %q:~1%concat%q:~1%

Результатом будет _concat_ в первом случае и concat во втором.

1

@Laszlo Valko: Вы не говорите, какой CP вы используете, но я бы "подделал" пустую переменную, используя Alt-255, который является "невидимым" символом, по крайней мере в CP 437. Используя ваш пример:

@echo off
::The line below contains the invisible character (Alt-255)
echo Q set to "Invisible"
set Q= 
set Q
echo %Q%
echo "%Q%"
echo Q set to Empty
set Q=
set Q
echo %Q%
echo "%Q%"
echo Q set to "/Q"
set Q=/Q
set Q
echo %Q%
echo "%Q%"

Использование SET Q покажет вам все переменные, которые начинаются с Q. Попробуйте SET C и вы поймете, что я имею в виду. Как вы можете видеть, когда переменная пуста, она удаляется. Когда вы выполняете ECHO %Q% интерпретатор команд думает, что вы просто произносите ECHO а затем он сообщает вам состояние: включено или выключено. Поскольку я использовал @echo off в начале скрипта, он сообщает, что echo выключен.

Надеюсь, это поможет!

0

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

set "Var= "

Эти кавычки не являются обязательными. Но они действительно помогают явно увидеть это пространство и сохранить его в случае процедур очистки терминала.

Более подробную информацию вы можете найти здесь: Команда SET.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .