【问题标题】:Powershell - StreamwriterPowershell - Streamwriter
【发布时间】:2015-04-28 02:46:18
【问题描述】:

我需要尽快写入许多文件,但使用 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()

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

【问题讨论】:

    标签: powershell streamwriter


    【解决方案1】:

    几点

    Get-ContentSet-Content

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

    $Contents = Get-Content $File
    

    然后$Contents 包含一个 array 字符串,这些字符串表示文件中的行。

    通过将其发送回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(),因为您不需要在文件末尾插入额外的行(除非您这样做,但这可能会让人感到困惑,可能需要添加它改为内容)。

    【讨论】:

    • 感谢一个完整的新手。话虽如此,我很喜欢你的详尽解释。干杯:)
    【解决方案2】:

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

    $Contents = get-content $File -Raw
    

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2023-04-05
      • 2019-12-11
      • 2016-08-11
      • 2021-07-10
      • 2014-03-21
      • 2018-07-13
      • 2017-08-16
      • 2020-11-28
      相关资源
      最近更新 更多