在PowerShell Out-File命令中阻止跟踪换行符

Mat*_*att 25 powershell powershell-2.0

如何防止PowerShell的Out-File命令在输出的文本后附加换行符?

例如,运行以下命令会生成一个内容为"TestTest\r \n"而不仅仅是"TestTest"的文件.

"TestTest" | Out-File -encoding ascii test.txt
Run Code Online (Sandbox Code Playgroud)

bri*_*ist 37

在PowerShell 5.0+中,您将使用:

"TestTest" | Out-File -encoding ascii test.txt -NoNewline
Run Code Online (Sandbox Code Playgroud)

但在早期版本中,您根本无法使用该cmdlet.

试试这个:

[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)
Run Code Online (Sandbox Code Playgroud)

  • 也使用附加开关以避免覆盖整个文件。即“TestTest” | Out-File -encoding ascii test.txt -NoNewline -Append (2认同)

mkl*_*nt0 8

为了补充 briantist的有用的答案再次-NoNewline:

以下内容不仅适用于Out-File,而且类似于Set-Content/ Add-Content也适用; -NoNewline如上所述,需要PSv5 +.

请注意,这-NoNewline意味着要输出多个对象,它不仅仅是一个被抑制的尾随换行符(换行符),而是任何换行符.

换句话说:输入对象字符串表示直接连接,没有分隔符(终止符).

因此,以下命令导致相同的文件内容(TestTest没有尾随换行符):

# Single input string
"TestTest" | Out-File -encoding ascii test.txt -NoNewline

# Equivalent command: 2-element array of strings that are directly concatenated.
"Test", "Test" | Out-File -encoding ascii test.txt -NoNewline
Run Code Online (Sandbox Code Playgroud)

输出对象之间,而不是输出对象之间放置换行符,必须显式地使用换行符连接对象:

"Test", "Test" -join "`r`n" | Out-File -encoding ascii test.txt -NoNewline
Run Code Online (Sandbox Code Playgroud)

要创建Unix风格的仅LF换行符,请使用"`n"而不是"`r`n".

警告:

上面的-join解决方案隐式地将输入对象转换为字符串(如果它们尚未存在)并通过.ToString()在每个对象上调用.NET 方法来实现,这通常产生与Out-File直接创建的表示不同的表示,因为Out-File使用PowerShell的默认输出格式化程序 ; 例如,比较(Get-Date).ToString()和仅的输出Get-Date.

如果您的输入仅包含.ToString()表示令人满意的字符串和/或非字符串,则上述解决方案有效,但请注意,通常最好使用Set-Contentcmdlet,它隐式应用相同的字符串化.
有关Out-File和之间差异的完整讨论Set-Content,请参阅我的答案.

如果您的输入具有非字符串,您希望将其格式化为打印到控制台,则实际上没有简单的解决方案:虽然您可以使用Out-String默认格式化程序创建每对象字符串表示,但Out-String缺少-NoNewline(从v5.1开始; 这个GitHub问题建议引入它)将总是产生尾随换行符.