避免写入输出中的换行符

时间:2011-05-27 09:22:49

标签: powershell

我想从日志文件中收集脚本的所有输出,并且必须使用write-output instaed of write-host。

Write-Output "Server:" $a看起来像

Server:
foo

我真的要写信写 获得write-output $("sfdghk:" + $a)

Server:Foo

由于 -jt

4 个答案:

答案 0 :(得分:15)

在互联网上找到某个地方:

Write-Output "Server: $($a)"

在我的代码中效果很好。

答案 1 :(得分:6)

9个小时......我开始回答。

在Powershell中,你操纵的一切都是一个对象。

所以“服务器:”是一个对象,$ a是一个对象

PS> "server :".gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

Write-output是一个CmdLet,它将对象放在一种列表(管道)中,供其他CmdLets或脚本使用。所以“Server:”和“foo”之间没有真正的换行符。这是控制台向您显示对象列表(数组)的方式。正如您在此处所见:

PS> $a = "foo"
PS> (Write-Output "Server :" $a).gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

显然这是一个摘要,但我希望它可以让你明白。

答案 2 :(得分:6)

Write-Output "Server: $a"
Write-Output ("Server: {0}" -f $a)
Write-Output ("Server: " + $a)

如果要将脚本的输出收集到日志文件中,请考虑使用Start-Transcript。它将每个命令和所有PowerShell输出记录到文件中。但是,它不记录发送到stdout的任何内容,因此如果您使用任何旧版命令,则必须将其输出通过管道传输到Write-Host

Start-Transcript C:\logs\mylog.txt
Write-Host "Server: " $a
ping | Write-Host

答案 3 :(得分:3)

现有答案中有很好的信息,但让我尝试一个务实的总结:

  • 当打印到控制台重定向到文件时, Write-Output会将多个参数分隔开来每个换行

  • 因此,为了生成单行输出,您必须"预先组装"要输出到字符串的部分,您将其作为单个参数传递。

  • 除了禁止集合的枚举之外,通常不需要明确使用Write-Output ,因为默认情况下PowerShell 会发送任何不是在变量中捕获或重定向到其他地方或通过管道发送到 [success]输出流Write-Output也写入);因此,在手头的情况下,以下就足够了:

"Server: $a"  # what this expandable string expands to is *implicitly* output

可能令人困惑的是 Write-Host cmdlet的行为方式不同,但重要的是要注意它具有不同的用途。< / p>

# IMPORTANT: Do not use Write-Host to output *data*; only use it to write
#            directly to the host (console).
> Write-Host "Server:"     $a    # multiple spaces used on purpose
Server: srv1
Write-Host不同,

Write-Output会将多个参数分别用单个空格分隔。
还有其他重要的差异,我的this answer总结了这些差异。

鉴于问题的通用标题,我们还要解决如何压制尾随换行符

  • 要将打印到控制台 ,您可以使用Write-Host -NoNewline

  • 使用数据输出,无论是通过Write-Output,隐式输出还是来自其他命令:

    • 当输出发送到控制台时,无法阻止尾随换行符。

    • 很遗憾,从Windows PowerShell v5.1 / PowerShell Core v6.0.0开始, 无法阻止在向外部发送文本时使用尾随换行符程序通过管道 - 请参阅this GitHub issue

    • 但是,在PSv5 +中,当捕获文件中的输出时, 可以阻止跟踪换行 >,使用Out-File -NoNewlineSet-Content -NoNewline(在PSv4-中,您必须直接使用.NET Framework);相反,重定向到>的文件会附加一个尾随换行符。

      • 警告:如果您要输出多个对象,-NoNewline不仅会抑制尾随换行符,还会抑制之间的换行符这些对象。
      • 有关Out-FileSet-Content之间的差异以及何时选择,请参阅我的this answer