如何防止PowerShell的Out-File命令在输出文本后附加换行符?
例如,运行以下命令会生成一个内容为“TestTest \ r \ n”的文件,而不仅仅是“TestTest”。
"TestTest" | Out-File -encoding ascii test.txt
答案 0 :(得分:32)
在PowerShell 5.0+中,您将使用:
"TestTest" | Out-File -encoding ascii test.txt -NoNewline
但在早期版本中,您根本无法使用该cmdlet。
试试这个:
[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)
答案 1 :(得分:7)
补充 briantist's helpful answer re -NoNewline
:
以下内容不仅适用于Out-File
,也适用于Set-Content
/ Add-Content
;如上所述,-NoNewline
需要PSv5 +。
请注意 -NoNewline
表示 多个对象要输出,它不仅仅是尾随> em>新行(换行符)被抑制,但任何换行符。
换句话说:输入对象的字符串表示直接连接,没有分隔符(终止符)。
因此,以下命令会生成相同的文件内容(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
为了仅在之间设置,而不是 输出对象之后的,您必须使用换行符加入对象明确地强>:
"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 ,它隐式应用相同的字符串
有关Out-File
和Set-Content
之间差异的完整讨论,请参阅我的this answer。
如果您的输入具有非字符串,您希望将其格式化为打印到控制台,那么实际上没有简单的解决方案:虽然您可以使用Out-String
创建每个对象的字符串表示形式默认格式化程序,Out-String
缺少-NoNewline
(从v5.1开始; this GitHub issue建议引入它)将始终产生尾随换行符。
答案 2 :(得分:0)
为补充briantist和mklement0的有用答案,请重新输入 -NoNewline :
我创建了这个小函数来替换Powershell早期版本中 Out-File 的 -NoNewLine 参数。
注意:在我的情况下,该文件是包含7行(星期几和更多值)的.csv文件
## Receive the value we want to add and "yes" or "no" depending on whether we want to
put the value on a new line or not.
function AddValueToLogFile ($value, $NewLine) {
## If the log file exists:
if (Test-path $Config.LogPath) {
## And we don't want to add a new line, the value is concatenated at the end.
if ($NewLine -eq "no") {
$file = Get-Content -Path $Config.LogPath
## If the file has more than one line
if ($file -is [array]) {
$file[-1]+= ";" + $value
}
## if the file only has one line
else {
$file += ";" + $value
}
$file | Out-File -FilePath $Config.LogPath
}
## If we want to insert a new line the append parameter is used.
elseif ($NewLine -eq "yes") {
$value | Out-File -Append -FilePath $Config.LogPath
}
}
## If the log file does not exist it is passed as a value
elseif (!(Test-path $Config.LogPath)) {
$value | Out-File -FilePath $Config.LogPath
}
}