在PowerShell中向文本文件写入新行

51

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

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

当我在日志文件上执行Get-Content时,它会正确地显示,在"local value."之前有一个新行。

但是,当我在记事本中打开日志文件时,它会将所有内容都显示在同一行上。我该如何使它在文本文件中也插入一个新行呢?

6个回答

69

`n是换行符。Notepad (Windows 10之前版本)期望将换行符编码为`r`n(回车+换行符,CR-LF)。在一些实用的编辑器(SciTE, Notepad++, UltraEdit-32, Vim, ...)中打开文件并将换行符转换为CR-LF。或者使用PowerShell:

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

如果我更改代码以在换行符之前包含回车符,记事本会正确显示文件吗? - NewPowerSheller
如果您重新创建文件:是的,它应该正确显示新创建的文件。 - Ansgar Wiechers
我正在使用PowerShell v4($PSVersionTable.PSVersion),并且在使用rn | Out-File -Encode Ascii时,使用两个r`n会创建两个空行,因此我改用只有一个r`,这样可以正确地创建单个行间距。 - user4317867
谢谢你的回答。工作得很好。干杯。 - Anjana Silva

21
你可以使用Environment类的静态NewLine属性来获取正确的换行符:
$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

这就是我最终使用的。 - Master Azazel

19

在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
"@

@符号改变了“”中文本的读取方式。使用@符号,文本将按照原样读取。这意味着文本不会进行任何额外处理,并且换行符也包括在内。 - TinyRacoon

2

在使用管道命令时,数值对我无效。 我创建了一个额外的Add-Content,并将其 -Value 设置为空字符串"", 然后再使用我原本尝试使用的 Get | Add 命令。

$newfile = "C:\FilePath\Newfile.txt" 
$oldfile = "C:\FilePath\Oldfile.txt"

Add-Content -Path "$newfile" -value ""
Get-Content -Path "$oldfile | Add-Content -Path "$newfile"

0
"Line-1$([Environment]::NewLine)`"Line-2`"$([Environment]::NewLine)Line-3"| out-File c:\Temp\abc.txt 

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接