我想从日志文件中收集脚本的所有输出,并且必须使用write-output instaed of write-host。
Write-Output "Server:" $a
看起来像
Server:
。
foo
我真的要写信写
获得write-output $("sfdghk:" + $a)
Server:Foo
由于 -jt
答案 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 -NoNewline
或Set-Content -NoNewline
(在PSv4-中,您必须直接使用.NET Framework);相反,重定向到>
的文件会附加一个尾随换行符。
-NoNewline
不仅会抑制尾随换行符,还会抑制之间的换行符这些对象。Out-File
和Set-Content
之间的差异以及何时选择,请参阅我的this answer。