Что такое буквальный escape-символ в Powershell?

51

При включении литерального символа кавычки в строку в кавычках в Powershell, как я могу экранировать символ кавычки, чтобы указать, что он является литералом, а не разделителем строк?

Дэвид Альперт
источник

Ответы:

75

Из help about_quoting_rules

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

'As they say, "live and learn."'

Вывод этой команды:

As they say, "live and learn."

Вы также можете заключить строку в одинарные кавычки в строку в двойных кавычках. Например:

"As they say, 'live and learn.'"

Вывод этой команды:

As they say, 'live and learn.'

Чтобы заставить Windows PowerShell буквально интерпретировать двойные кавычки, используйте символ обратной черты. Это не позволяет Windows PowerShell интерпретировать кавычку как разделитель строк. Например:

"Use a quotation mark (`") to begin a string."

Вывод этой команды:

Use a quotation mark (") to begin a string.

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

Использование символа обратной кавычки для экранирования других кавычек в строках с одинарными кавычками не поддерживается в последних версиях PowerShell. В более ранних версиях PowerShell escape-символ обратного удара можно было использовать для экранирования символа двойной кавычки в одной строке в кавычках, как подробно описано в help about_quotingдокументе, доступном в этих версиях PowerShell.

Helvick
источник
2
Просто примечание, но кажется, что вы не можете избежать одинарных кавычек. Ваш последний пример недействителен. Возможно, что-то изменилось со времени вашего поста, так как я не могу найти эту about_quotingпомощь. Запуск powershell v5.1. Экранирование двойных кавычек или вложение различных типов кавычек по-прежнему работает, как и ожидалось.
Кал Зекдор
1
Интересно - кажется, что поддержка экранирования одинарных кавычек была ошибкой. Файл справки about_quoting был заменен на about_quoting_rules, и в нем четко сказано, что нельзя использовать обратную кавычку для экранирования одинарных кавычек в PowerShell v5, поскольку строки в одинарных кавычках являются литералами. Хороший улов, это было по-другому в V3.
Хелвик
1
Обратите внимание, что одинарные кавычки экранируются путем их удвоения в одинарных кавычках, как в SQL. Таким образом, 'As they say, ''live and learn.'''вывод As they say, 'live and learn.', так же, как ваш второй пример.
brianary
13

Побег символ в Powershell является "` "(обратный апостроф / могила).

Это может быть использовано для экранирования кавычек, а также специальных символов (например, tab это `t).

Адам Бранд
источник
2
Это, вероятно, сведет с bashума пользователей. ( cmd.exeПобег персонаж ^)
grawity
2
Что ж, если ты щуришься, то это похоже на обратную косую черту.
koenigdmj
10

Чтобы дополнить то, что уже было предоставлено здесь, вы также должны знать, что вы можете избежать кавычки (одинарной или двойной) с самой цитатой. Это означает, что вы можете сделать это:

Msgstr "Вот пример строки" "в двойных кавычках" "."

и это:

На этот раз это «одинарные кавычки».

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

Poshoholic
источник
1

один текст, поэтому он обрабатывается как буквальный текст, а затем экранирует любые специальные символы, используя «\»

например, эта строка: «Как говорится,« живи и учись ».« Становится этой строкой ». Как говорится,« живи и учись ».

dvdccd
источник
1
Не в PowerShell, это не так. PS C: \ WINDOWS \ system32> Write-Host 'Как говорится, \ "живи и учись \". Как говорится, \ "живи и учись. \"
HopelessN00b
1
@ HopelessN00b, может быть, давайте не будем судить слишком строго - это работает, если вы используете PowerShell.exe -Commandи пытаетесь передать двойные кавычки в параметре (поскольку, технически, это CMD, экранирующий его, но действительный в параметре команды). imgur.com/1btjoQW
jparnell8839