Qual è il carattere di fuga letterale in Powershell?


51

Quando si include un carattere di citazione letterale all'interno di una stringa tra virgolette in Powershell, come posso evitare il carattere di citazione per indicare che è un delimitatore letterale anziché di stringa?

Risposte:


75

A partire dal help about_quoting_rules

Per far apparire le virgolette doppie in una stringa, racchiudere l'intera stringa tra virgolette singole. Per esempio:

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

L'output di questo comando è:

As they say, "live and learn."

È inoltre possibile racchiudere una stringa tra virgolette singole in una stringa tra virgolette doppie. Per esempio:

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

L'output di questo comando è:

As they say, 'live and learn.'

Per forzare Windows PowerShell a interpretare letteralmente le virgolette doppie, utilizzare un carattere backtick. Ciò impedisce a Windows PowerShell di interpretare le virgolette come delimitatore di stringa. Per esempio:

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

L'output di questo comando è:

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

Poiché il contenuto delle stringhe a virgoletta singola viene interpretato letteralmente, non è possibile utilizzare il carattere backtick per forzare un'interpretazione letterale di caratteri in una stringa a virgoletta singola.

L'uso del carattere backtick per evitare altre virgolette nelle stringhe tra virgolette singole non è supportato nelle versioni recenti di PowerShell. Nelle versioni precedenti di PowerShell il carattere di escape backtick poteva essere utilizzato per evitare un carattere di virgolette doppie all'interno di una singola stringa tra virgolette come dettagliato nel help about_quotingdocumento disponibile in quelle versioni di PowerShell.


2
Solo una nota, ma sembra che tu non possa sfuggire alle virgolette singole. Il tuo ultimo esempio non è valido. Forse qualcosa è cambiato dal tuo post, dato che non riesco nemmeno a trovare about_quotingquell'aiuto. Esecuzione di PowerShell v5.1. L'escape delle virgolette doppie o l'annidamento di diversi tipi di virgolette funziona ancora come previsto.
Kal Zekdor,

1
Interessante - sembrerebbe che il supporto per la fuga da virgolette singole fosse un bug. Il file della guida di about_quoting è stato sostituito da about_quoting_rules e indica chiaramente che non è possibile utilizzare un backtick per evitare virgolette singole in PowerShell v5 perché le stringhe con virgolette singole sono letterali. Buona cattura, questo era diverso in V3.
Helvick,

1
Si noti che le virgolette singole vengono salvate raddoppiandole in stringhe tra virgolette singole, come in SQL. Quindi 'As they say, ''live and learn.'''produce As they say, 'live and learn.', lo stesso del tuo secondo esempio.
brianary,

13

Il personaggio di escape in Powershell è il "'" (apostrofo / tomba all'indietro).

Questo può essere usato per sfuggire alle virgolette e anche ai caratteri speciali (ad esempio, tab è `t).


2
Questo probabilmente farà bashimpazzire gli utenti. (Il cmd.exepersonaggio di fuga è ^)
gravità

2
Bene, se socchiudi gli occhi, sembra un colpo di frusta.
Koenigdmj,

10

Per completare ciò che è già stato fornito qui, dovresti anche sapere che puoi evitare una citazione (singola o doppia) con la citazione stessa. Ciò significa che puoi farlo:

"Ecco un esempio di" "stringa tra virgolette doppie" "."

e questo:

'Questa volta è' 'a virgoletta singola' '.'

Il vantaggio offerto da questa sintassi è semplice: è più facile digitare la stessa virgoletta due volte che sfuggire a una citazione con un backtick.


1

singolo 'testo', quindi viene trattato come testo letterale, quindi evita qualsiasi carattere speciale usando "\"

ad es. questa stringa: "Come si suol dire," vivi e impara "." Diventa questa stringa 'Come si suol dire, \ "vivi e impara. \"'


1
Non in PowerShell, non è così. PS C: ' "vivere e imparare \" Come si suol dire, \' "Vivi e impara \" \ WINDOWS \ system32> Write-Host Come si suol dire, \
HopelessN00b

1
@ HopelessN00b forse non giudichiamo troppo duramente - questo funziona se stai usando PowerShell.exe -Commande provando a passare virgolette doppie nel parametro (come, tecnicamente, è CMD che lo sfugge, ma è valido nel parametro del comando). imgur.com/1btjoQW
jparnell8839
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.