есть ли экранирование символа '&' в командной строке?

11

Я пытаюсь что-то вроде:

set pwd = abc&123
echo password %pwd%

Я получаю результат как ...

'123' is not recognized as an internal or external command, operable program or batch file. 
password abc

Система такая или есть спасение для таких персонажей?

deostroll
источник
1
Тот же вопрос в SO Как мне избежать амперсандов в пакетных файлах?
Майкл Фрейдгейм

Ответы:

9

Что вам нужно сделать, это заключить пароль в двойные кавычки, например, так:

set pwd="abc&123"
echo %pwd%

Дайте мне знать, как это происходит.

Carlos
источник
1
Другой вариант, который может быть предпочтительным в некоторых сценариях,set "pwd=abc&123"
Гарри Джонстон,
1
-1 Это шокирует, что у этого было 5 голосов, это неправильно. Windows использует% var% или! Var! Вы могли бы проверить это сами так легко. $ var в linux, если вы выводите $ var в windows, он буквально говорит: $ var
barlop
1
@ barlop: видя, как это другая строка, которая отвечает на вопрос, я не вижу, что это имеет значение.
Гарри Джонстон
7

Я обнаружил, что это лучше всего работает с комбинацией ответа Мартино и ответа mastashake57.

set pwd=abc^&123
echo %pwd%

По-прежнему не удается, и

set pwd="abc&123"
echo %pwd%

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

Однако,

set "pwd=abc^&123"
echo %pwd%

Работает отлично.

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

БДМ
источник
+1. Имейте в виду, что это оставляет карат в переменной среды, т. Е. Устанавливается pwdв abc^&123. В большинстве случаев это, вероятно, именно то, что вам нужно сделать, но это может вас поймать, если вы не знаете, что происходит.
Гарри Джонстон
@HarryJohnston Я должен исправить твою орфографическую ошибку. Это carEt. Кстати, я знаю, что ntcmds.chm упоминает это, но где в cmd /? в документации упоминается о том, что карета была спасательным персонажем?
Бароп
@ Барлоп: так оно и есть; Я путал это с омонимом. По общему правилу /?предоставляется только сводная, а не исчерпывающая документация.
Гарри Джонстон
@ barlop,? Каретка - это спасательный персонаж.
Pacerier
@Pacerier да, карета - это побег, никто с этим не согласен. и упоминается, что это escape-символ, в ntcmds.chm (ntcmds.chm поставляется с XP и находится в эквивалентном онлайн-сайте microsoft.com/resources/documentation/windows/xp/all/proddocs/… а может быть, в некоторых отношениях более актуальный онлайн - возможно, больше команд). Я просто спрашивал, где в /? (если где-нибудь), это говорит о том, что карета - это спасательный персонаж
барлоп
7

Из справочного файла справки командной строки:

Амперсанд (&), pipe (|) и круглые скобки () являются специальными символами, которым должны предшествовать escape-символ (^) или кавычки при передаче их в качестве аргументов.

Похоже, что вводить весь пароль в кавычки было бы проще, чем экранировать отдельные символы, если в нем более двух символов, требующих обработки.

Мартино
источник
И цитаты в кавычках?
Pacerier
4

Что вам действительно нужно:

set pwd=abc^^^&123
echo %pwd%

Или:

set "pwd=abc^&123"
echo %pwd%

Объяснение:

Поскольку &это специальный символ, вы должны избегать его ^, в результате чего ^&.

Запуск set pwd=abc^&123установит переменную в значение abc&123. После этого, если вы должны были бежать echo %pwd%, вы эффективно работаете echo abc&123.

Тем echo abc&123не менее , не работает, как вы ожидаете, потому что &это специальный символ. Вы можете избежать этого, добавив кавычки: echo "abc&123"но ваш вывод также будет содержать кавычки. Другими словами, использование кавычек не совсем правильное решение.

Что вам нужно, это экранировать &символ при запуске echoкоманды:

echo abc^&123

Таким образом, переменная должна содержать значение abc^&123. Чтобы установить значение переменной abc^&123, вам нужно будет экранировать специальные символы ^и &, в результате:

set pwd=abc^^^&123
Pacerier
источник
+1 за указание на необходимость убежать от
кареты
Отлично работает, спасибо. Этот экранирующий символ почему-то не упоминается в документе docs.microsoft.com/en-us/windows-server/administration/…
Сергей Смольников