如果這是針對此特定問題的重復問題,請原諒我并請指出正確的方向 - 到目前為止我還沒有在 Stack Overflow 中看到過這個問題。
我正在使用PowerShell如下一組命令來查找檔案中的“NUL”字符。(-replace作業得很好 - 這不是我的問題)
$findString = '\x00'
$replString = 'DERPS'
$foo = [IO.File]::ReadAllText("C:\SomeFile.txt")
$bar = $foo -replace $findString, $replString
[IO.File]::WriteAllText("C:\SomeFile_2.txt", $bar)
$Lines = Get-Content "C:\SomeFile_2.txt" -tail 10
#I have also used the following with the same effect:
#$Lines = Get-Content "C:\SomeFile_2.txt" |Select-Object -last 10
[IO.File]::WriteAllText("C:\FOOBARRED.txt", $Lines)
Set-Content "C:\NOT_FOOBARRED.txt" $Lines
我遇到的是[IO.File]它將最后 10 行連接成一個字串:
Line 1 of 10 Line 2 of 10 Line 3 of 10 Line 4 of 10 Line 5 of 10 Line 6 of 10 Line 7 of 10 Line 8 of 10 Line 9 of 10 DERPSDERPSDERPSDERPSDERPS
隨著Set-Content我的輸出看起來是正確的:
Line 1 of 10
Line 2 of 10
Line 3 of 10
Line 4 of 10
Line 5 of 10
Line 6 of 10
Line 7 of 10
Line 8 of 10
Line 9 of 10
DERPSDERPSDERPSDERPSDERPS
誰能解釋一下有什么區別?假設“WriteAllText”命令在原始格式下作業是否正確,但如果以任何方式處理它,它將接受資料作為一個大 blob?
uj5u.com熱心網友回復:
[IO.File]::WriteAllText()期望單個(可能是多行)字串作為其contents引數的引數。
相反,Get-Content -Tail 10回傳一個陣列串的(當在一個變數中捕獲的),每個包含線從與剝離尾部換行符該檔案。
PowerShell 執行許多自動型別轉換,雖然它們通常很有用,但有時它們沒有用:在這里,它通過將每個元素與一個空格連接起來自動將陣列轉換為單行字串[1],如下所示示例演示:
PS> "$('line1', 'line2')" # stringify an array
line1 line2 # elements were joined with a space
存盤在呼叫$Lines背景關系中的陣列的這種自動字串化[IO.File]::WriteAllText()導致了您的問題。
因此,使用[IO.File]::WriteAllLines()代替(注:行而不是文本),它期待一個陣列串并作為線條到檔案中,與(平臺的本地)來換行每個終止寫入其元件。
換句話說:它就像Set-Content給定一個字串陣列一樣,但請注意,在Windows PowerShell 中,默認情況下您最終會得到一個ANSI編碼的檔案Set-Content,而 .NET - 現在是PowerShell (Core) 7 ,始終如一 -默認為無 BOM 的 UTF-8。
作為旁白:
PowerShell 的替代方案
[IO.File]::ReadAllText()是Get-Content與-Raw開關一起使用。您已經知道
Set-ContentPowerShell 是[IO.File]::WriteAllLines().[IO.File]::WriteAllText()如果您將單個多行字串傳遞給它并指定
-NoNewline開關,它也可以作為替代。
[1] 空格字符是默認值,您可以通過$OFS首選項變數覆寫它,盡管這在實踐中很少見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366178.html
標籤:电源外壳
上一篇:如何獲取輸入值
