這兩個命令都不會創建多行文本:
Set-Content .\test.md 'Hello`r`nWorld'
Set-Content .\test.md 'Hello\r\nWorld'
只有這個可以
Set-Content .\test.md @("Hello`nWorld")
你知道這是為什么嗎?
uj5u.com熱心網友回復:
轉義序列,例如
`r`n僅在內部作業"...",即可擴展(插值)字串。- 相比之下,
'...'字串是不解釋其內容的逐字字串- 甚至實體也`被用作逐字(字面意思)。
- 相比之下,
只有
`(所謂的反引號)用作 PowerShell 中的轉義字符,而不是\.- 也就是說,在和
"..."字串'...'中,a\都是文字。 - (但是,
\是正則運算式(正則運算式)背景關系中的轉義字符,但是解釋它們的是.NET 正則運算式引擎,而不是 PowerShell;例如,"`r" -match '\r'是$true:(插值的)文字CR 字符。匹配其轉義的正則運算式表示)。
- 也就是說,在和
至于你嘗試了什么:
事實上,
"Hello`nWorld"在你的最后一個命令中是一個"..."使它作業的字串。- 相比之下,將字串包含在
@(...)陣列子運算式運算子中是解決方案的附帶條件。(Set-Content的(位置隱含的)-Value引數無論如何都是陣列System.Object[]值的( ),因此即使傳遞的單個字串也被強制轉換為陣列)。
- 相比之下,將字串包含在
最后,請注意
Set-Content默認情況下會在輸出檔案中添加一個尾隨平臺原生換行符;用于抑制這種情況,但請注意,如果適用(在您的情況下只有一個-NoNewLine) ,這樣做也不會在多個輸入物件(的字串表示形式)之間放置換行符。
因此(注意-NoNewLine和尾隨`n):
Set-Content -NoNewLine .\test.md "Hello`nWorld`n"
可選閱讀:PowerShell 行為的設計原理:
為什么 PowerShell不像其他語言那樣使用反斜杠 (
\) 作為轉義字符?
因為 PowerShell 必須(也)在Windows上運行(它一開始只在 Windows 上運行),所以使用\轉義字符- 如 Bash 等 Unix(POSIX 兼容)shell 中所知 -不是一個選項,因為它\被用作Windows 上的路徑分隔符。
如果\ 是轉義字符,則必須使用Get-ChildItem C:\\Windows\\System32而不是,這在shellGet-ChildItem C:\Windows\System32中顯然是不切實際的,在這種情況下處理檔案系統路徑非常普遍。
因此,必須選擇一個不同的字符,結果是`,所謂的反引號:至少在美國鍵盤上,它很容易輸入(就像\),并且它的好處是很少出現(就像它本身一樣)在現實世界的字串中,因此很少出現逃避它的需要。
請注意,Windows 上更古老的遺留 shellcmd.exe也必須選擇不同的字符:^,即所謂的caret。
為什么它不像其他語言那樣交替使用單引號和雙引號?
不同的語言做出了不同的設計選擇,但是在制作"..."字串插值而不是'...'字串時,PowerShell確實遵循了這里的現有語言,即與POSIX 兼容的 shell,例如 Bash。與后者不同,它還支持逐字嵌入其中,轉義為(例如,)''...''''6'' tall'
鑒于 PowerShell 對向后兼容性的承諾,這種行為不會改變,尤其是考慮到它對于語言的重要性。
從概念上講,您可以爭辯說,字串使用的參考字符的方面應該與它是否是interpolating分開,以便您可以為方便起見自由選擇其他參考樣式,同時單獨控制是否應該進行插值。
因此,假設PowerShell可以使用一個單獨的符號來制作一個字串插值,比如說$"..."和$'...'(類似于 C# 現在提供的,盡管它明顯只有一種字串參考樣式)。(順便說一句:Bash 和 Ksh確實有這種語法形式,但它用于不同的目的(字串的本地化)并且在實踐中很少使用)。
然而,在實踐中,一旦您知道如何使用 PowerShell"..."并'...'在其中作業,就不難讓它們按預期作業。
有關基本功能的 PowerShell 、和 POSIX 兼容 shell的并列,請參閱此答案。cmd.exe
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521960.html
標籤:电源外壳逃跑新队
