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

时间:2016-02-08 21:38:58

标签: powershell powershell-v2.0

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

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

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

3 个答案:

答案 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-FileSet-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
    }
}