Как изменить переменную окружения с помощью специальных символов?

Моя подсказка настроена на $P$_CMD> (с пробелом в конце). Это прекрасно работает. Однако, virtualenv's activ.bat имеет следующую строку:

set PROMPT=(approot) %PROMPT%

Когда я запускаю эту команду, cmd жалуется, что

The syntax of the command is incorrect.

Этого не произошло до того, как я изменил свое приглашение. Я пытался добавить кавычки (двойной " и один ') вокруг %PROMPT%, но это не работает. Как изменить подсказку, используя старое значение, если старое значение содержит специальные символы?

1 ответ

Решение

С переменной prompt вы никогда не должны использовать специальные символы. Всегда используйте special codes что можно найти с prompt /? когда возможно.

В ответ на ваш комментарий:

С другими переменными вы можете использовать SetLocal EnableDelayedExpansion, Затем обратитесь к переменным с ! с вместо % s.

Задержка расширения приведет к тому, что переменные будут расширяться во время выполнения, а не во время разбора, эта опция включается с SETLOCAL command, Когда действует отложенное расширение, на переменные можно ссылаться, используя !variable_name! (в дополнение к обычному %variable_name%)

Поскольку переменная раскрывается во время выполнения, и специальный символ > (в этом случае) является особенным только во время разбора, вы полностью обойдете проблему.

Например:

SetLocal EnableDelayedExpansion

set test=World^>
set test2=Hello !test!

Обратите внимание, что ^ является escape-символом, позволяющим вводить специальные символы (переменная будет сохранена как World> так что если вы не делаете set test=World^^^> приводя к сохраненному значению World^> это не сработает для вашего вопроса.

Побег может быть сложным. Например, чтобы установить test2 к буквальному !test! нужно использовать ^^!test^^! иначе вы просто получите значение test, Если мне действительно нужно, я обычно просто изменяю количество escape-символов, пока это не сработает, это проще, чем пытаться выяснить правила синтаксического анализа.

Другие вопросы по тегам