簡體   English   中英

PowerShell 中的轉義反引號“`”和反斜杠“\\”有什么區別?

[英]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.exeWindows 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM