防止在PowerShell Out-File命令中尾随换行符

Prevent trailing newline in PowerShell Out-File command

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

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

1
"TestTest" | Out-File -encoding ascii test.txt


在PowerShell 5.0+中,您将使用:

1
"TestTest" | Out-File -encoding ascii test.txt -NoNewline

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

尝试这个:

1
[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)


为了补充briantist的有用答案,请重新输入-NoNewline

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

请注意,-NoNewline表示要输出多个对象,它不仅抑制了尾随的换行符(换行符),而且还抑制了任何换行符。

换句话说:输入对象的字符串表示形式直接连接在一起,没有分隔符(终止符)。

因此,以下命令导致相同的文件内容(TestTest,不带换行符):

1
2
3
4
5
# 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

为了仅在输出对象之间而不是之后放置换行符,必须将对象与换行符明确地连接起来:

1
"Test","Test" -join"`r`n" | Out-File -encoding ascii test.txt -NoNewline

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

警告:

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

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

如果您的输入包含要格式化的非字符串,就像要打印到控制台一样,则实际上没有简单的解决方案:虽然您可以使用Out-String使用默认格式化程序缺少-NoNewline(从v5.1开始;此GitHub问题建议引入它)将始终产生尾随换行符。