【问题标题】:Writing new lines to a text file in PowerShell在 PowerShell 中将新行写入文本文件
【发布时间】:2013-06-30 07:49:38
【问题描述】:

我正在创建一个错误日志文件。这是我当前的代码:

Add-Content -path $logpath $((get-date).tostring() + " Error " + $keyPath `
   + $value + " key " + $key +" expected: " + $policyValue `
   + "`n local value is: " +$localValue

当我在日志文件上Get-Content 时,它正确显示,在“本地值”之前有新行。

但是,当我在记事本中打开日志文件时,它会在一行中显示所有内容。我怎样才能让它在文本文件中也插入一个新行?

【问题讨论】:

    标签: powershell text newline


    【解决方案1】:

    `n 是换行符。记事本 (prior to Windows 10) 要求将换行符编码为 `r`n(回车 + 换行,CR-LF)。在一些有用的编辑器中打开文件(SciTENotepad++UltraEdit-32Vim,...)并将换行符转换为 CR-LF。或者使用 PowerShell:

    (Get-Content $logpath | Out-String) -replace "`n", "`r`n" | Out-File $logpath
    

    【讨论】:

    • 如果我将代码更改为在换行之前包含回车符,记事本能否正确显示文件?
    • 如果你重新创建文件:是的,它应该正确显示一个新创建的文件。
    • 我正在使用 PowerShell v4 ($PSVersionTable.PSVersion) 并同时使用 r`n creates two blank lines when using `r`n` | Out-File -Encode Ascii` so I switched to only r`,它正确地创建了一个单行空间。
    • 感谢您的回答。把工作做好。干杯。
    【解决方案2】:

    您可以使用Environment class's static NewLine property 获取正确的换行符:

    $errorMsg =  "{0} Error {1}{2} key {3} expected: {4}{5} local value is: {6}" -f `
                   (Get-Date),$keyPath,$value,$key,$policyValue,([Environment]::NewLine),$localValue
    Add-Content -Path $logpath $errorMsg
    

    【讨论】:

    • 这是我最终使用的
    【解决方案3】:

    还可以将换行符和回车符分配给变量,然后将它们附加到 PowerShell 脚本内的文本中:

    $OFS = "`r`n"
    $msg = "This is First Line" + $OFS + "This is Second Line" + $OFS
    Write-Host $msg
    

    【讨论】:

      【解决方案4】:

      试试这个;

      Add-Content -path $logpath @"
      $((get-date).tostring()) Error $keyPath $value
      key $key expected: $policyValue
      local value is:  $localValue
      "@
      

      【讨论】:

      • @ 符号改变了 "'s 内的文本的读取方式。使用 @'s,文本按“原样”读取。这意味着不对文本进行额外处理,并且换行符也包括在内。
      【解决方案5】:

      使用 Pipe 命令时,值对我不起作用。 我创建了一个额外的 Add-Content,其 -Value 为 nothing "" 后跟原来的Get |添加我正在尝试使用的内容。

      $newfile = "C:\FilePath\Newfile.txt" 
      $oldfile = "C:\FilePath\Oldfile.txt"
      
      Add-Content -Path "$newfile" -value ""
      Get-Content -Path "$oldfile | Add-Content -Path "$newfile"
      

      【讨论】: