[英]What is the difference between the escape backtick "`" and backslash "\" in PowerShell?
我知道兩者都在 PowerShell 中使用,但用於不同的上下文。
互聯網上關於這個主題的信息很少,唯一談論它的網站(沒有讓我理解這個概念)是:
https://www.rlmueller.net/PowerShellEscape.htm
我是 PowerShell 的初學者,我最近正在接近它。
\\
轉義的用例出現在我的另一個主題的答案中:
當我將參數傳遞給嵌套的 Start-Process 命令時,PowerShell 會刪除多個連續的空格
有沒有人可以通過示例和用例向我詳細解釋 PowerShell 中轉義反引號`
和反斜杠\\
之間的區別?
歡迎至少有一個來源,但這不是強制性的。
vonPryz 的有用回答很好地涵蓋了 PowerShell-內部角度; 讓我嘗試一個系統的總結,包括 PowerShell CLI角度,以及將帶有嵌入式"
參數傳遞給外部程序:
在PowerShell session 中,唯一的轉義字符是`
(所謂的反引號),在以下上下文中:
在可擴展字符串內( "..."
,雙引號),但不在逐字字符串內( '...'
,單引號); 有關支持的轉義序列,請參閱概念about_Special_Characters幫助主題:
# " must be escaped; escape sequence `n expands to a newline. "3`" of`nrain"
在不帶引號的命令參數中:
# > must be escaped to write verbatim 'a>b', # since outside a quoted string an unescaped > is a redirection. Write-Output a`>b
對於續行:
# Spread the Get-Date call across two lines. # Important: ` must be the *very last char* on the line. Get-Date ` -Year 2525
注意:各種子系統,無論是否特定於 PowerShell,都可能有自己的轉義規則,例如正則表達式中的\\
和通配符表達式中的`
。 由於這些子系統的參數是通過 PowerShell 字符串傳遞的,因此最好使用逐字字符串文字,以避免 PowerShell 自己的字符串插值與目標子系統最終看到的內容之間產生混淆; 例如'A $50 fine.' -match '\\$50'
'A $50 fine.' -match '\\$50'
(從字面上處理正則表達式元字符$
需要\\
)。
當從外部調用 PowerShell 時,通過其CLI應用不同的規則,可能還有:
為了遵守Windows上廣泛使用的 CLI (命令行界面,通過命令行接受參數的程序)約定:
在調用powershell.exe
( Windows PowerShell CLI)時, "
字符必須用反斜杠轉義- 即作為\\"
- 以便在解析原始命令行期間保留。
pwsh.exe
,跨平台的CLI,安裝點播PowerShell的(核心)7+版,現在很好地替代地接受""
[1]代替\\"
,這使得從呼叫cmd.exe
更穩健。
相比之下,未轉義的"
在命令行上具有語法功能,並告訴 PowerShell 參數之間的邊界在哪里;這些"
實例在命令行解析期間被刪除。
這確保了僅希望使用-File
參數調用帶有參數的 PowerShell腳本文件( .ps1
) 的外部調用者可以使用常規語法,而無需對 PowerShell 的 CLI 進行特殊情況調用。
但是,如果您使用-Command
參數將包含PowerShell 代碼的字符串傳遞給 CLI ,那么 PowerShell 最終解釋的內容顯然必須是語法上有效的 PowerShell 代碼。
警告:如果不指定-Command
也不-File
:
powershell.exe
默認為-Command
pwsh.exe
現在默認為-File
對於之間的差異-File
和-Command
在使用電話和時,看到這個答案。
如果使用-Command
,則有兩個順序解析階段:
命令行解析階段,其中語法(未轉義) "
被刪除,轉義\\"
(或""
)變成文字"
。
這個階段的結果然后被解析為 PowerShell 代碼,就像它來自 PowerShell 會話內部一樣。
因此,您可能需要結合使用\\
和`
-escaping ; 例如(從cmd.exe
調用):
C:>powershell.exe -Command " \"3`\" of snow as of $(Get-Date)\" "
3" of snow as of 11/04/2021 14:13:41
注意使用`\\"
是為了讓 PowerShell 看到`"
,即在命令行解析后在"..."
字符串中正確轉義的"
。
從PowerShell 調用外部程序時轉義"
:
作為shell ,PowerShell 的工作是將根據其語法規則傳遞的參數傳遞給目標可執行文件,以便 PowerShell 解析產生的逐字值以一種方式傳遞,使目標可執行文件能夠看到它們。 換句話說:PowerShell 應該在幕后自動執行任何所需的轉義。 (與cmd.exe
不同,PowerShell 不能按原樣傳遞它自己的參數語法,因為不能期望外部 CLI 理解'...'
字符串(單引號)或`
-escaping)。
舉一個簡單的例子:根據最廣泛使用的轉義約定,傳遞'3" of snow'
應該在幕后作為"3\\" of snow"
傳遞。
可悲的是,至少在 PowerShell 7.1 之前,情況並非如此,並且外部程序的參數中嵌入的"
字符必須另外手動進行\\
轉義才能正確傳遞。
# Broken behavior up to at least PS v7.1
PS> cmd /c echo '{ "foo": "bar" }'
"{ "foo": "bar" }" # !! Embedded " aren't escaped.
PS> choice.exe /d Y /t 0 /m '{ "foo": "bar" }'
{ foo: bar } [Y,N]?Y # !! When parsed by an executable,
# !! embedded " are effectively LOST.
# Manual escaping required.
PS> choice.exe /d Y /t 0 /m '{ \"foo\": \"bar\" }'
{ "foo": "bar" } [Y,N]?Y # OK
此錯誤自 v1 以來就存在,並且從未修復以避免破壞現有的解決方法。 這可能會在即將發布的(在撰寫本文時) v7.2 中發生變化——我不清楚修復是否需要選擇加入,而且看起來不符合標准的 Windows CLI 的高調異常也不會被容納。
有關更多信息,請參閱此答案,其中包括指向相關 GitHub 問題的鏈接。
[1] 在 PowerShell 中,僅在"..."
字符串中,您還可以使用""
來轉義嵌入的"
,作為`"
的替代方法
反引號`
在 Powershell 中用作轉義字符。 也就是說,轉義引號、制表符等。 與許多其他環境不同,Powershell 的換行符是`n
,而不是\\n
。 這具有簡化路徑的好處,因為它們在 Windows 中使用反斜杠。
作為一個實際的例子,在許多編程語言中,需要對路徑中的反斜杠進行轉義。 如果您的應用程序位於
c:\program files\newApplication\myApp.exe
它的路徑必須寫成
c:\\program files\\newApplication\\myApp.exe
雙反斜杠表示法實際上是一個反斜杠,而不是諸如制表符或換行符之類的元字符。 請注意,該路徑包含\\newApplication
。 現在, \\n
通常表示換行符,但顯然並非如此。 該文件不在
c:\program files\
ewApplication\myApp.exe
畢竟,不是嗎?
Powershell 中不需要轉義,因為反斜杠本身沒有特殊含義。 當 Powershell 看到c:\\program files\\newApplication\\myApp.exe
,它沒有為c:\\program files\\newApplication\\myApp.exe
的\\n
部分賦予任何特殊含義,它只是一個字符串文字。
反斜杠\\
用作正則表達式中的轉義字符並表示元字符。 也就是說,要匹配正則表達式中的文字*
,必須對其進行轉義,以免它表示 Kleene 星(零個或多個匹配項)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.