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)
为了补充 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问题建议引入它)将总是产生尾随换行符.
| 归档时间: |
|
| 查看次数: |
18593 次 |
| 最近记录: |