Powershell - Streamwriter

Powershell - Streamwriter

我需要尽快写入许多文件,但我没有按照我使用的方式使用 Streamwriter 获得我想要的结果。例如,如果我写...

$File = "c:\somefile"
$Contents = get-content $File
$Contents | set-content $File

于是读取文件内容,什么也不做,写回来...文件完全一样。但是如果我写...

$File = "c:\somefile"
$Contents = get-content $File
$stream = [System.IO.StreamWriter] $File
$stream.WriteLine("$contents")
$stream.close()

然后文件看起来好像所有的换行符都被忽略了,有点乱。我需要做什么才能正确写入?非常感谢!

Get-Content 将在换行处拆分文件,有效地删除换行符。使用 -Raw 开关将文件作为单个字符串读取,保持换行不变:

$Contents = get-content $File -Raw

几点

Get-ContentSet-Content

Get-Content 当你调用它时它会逐行读取文件(它不会给你换行符)。所以如果你这样做:

$Contents = Get-Content $File

然后 $Contents 包含一个 数组 字符串,代表文件中的行。

通过将其发送回 Set-Content(它知道如何处理字符串数组或管道),它将写入

字符串数组

当您使用 "$contents" 时,数组项将用空格而不是换行符连接,因此当您使用 $stream.WriteLine 时,您正在编写一个字符串,最后有一个换行符。

修复它

  1. 如果是PowerShell 3+,使用Get-Content $File -Raw一次读取整个文件,或者使用下面的方法自己将其变成一个字符串。

    $content = (Get-Content $File) -join "`r`n" 
    
  2. 不要那样做,而是使用这个:

    $stream.Write(($content -join "`r`n"))
    

请注意,我使用的是 Write() 而不是 WriteLine(),因为您不需要在文件末尾插入额外的一行(除非您这样做,但这可能会造成混淆,可能想将其添加到内容中)。