我想从日志文件中收集脚本的所有输出,并且必须使用write-output instaed of write-host.
Write-Output "Server:" $a 好像
Server:.
foo
我是否真的必须写信
write-output $("sfdghk:" + $a)才能获得Server:Foo
谢谢-jt
小智 14
发现在互联网上的某个地方:
Write-Output "Server: $($a)"
Run Code Online (Sandbox Code Playgroud)
在我的代码中工作得很好.
9个小时......我开始回答.
在Powershell中,你操纵的一切都是一个对象.
所以"Server:"是一个对象,$ a是一个对象
PS> "server :".gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Run Code Online (Sandbox Code Playgroud)
Write-output是一个CmdLet,它将对象放在一种列表(管道)中,供其他CmdLets或脚本使用.所以"Server:"和"foo"之间没有真正的换行符.这是控制台向您显示对象列表(数组)的方式.正如您在此处看到的:
PS> $a = "foo"
PS> (Write-Output "Server :" $a).gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Run Code Online (Sandbox Code Playgroud)
显然这是一个摘要,但我希望它可以让你理解.
Write-Output "Server: $a"
Write-Output ("Server: {0}" -f $a)
Write-Output ("Server: " + $a)
Run Code Online (Sandbox Code Playgroud)
如果要将脚本的输出收集到日志文件中,请考虑使用Start-Transcript.它将每个命令和所有PowerShell输出记录到文件中.但是,它不记录发送到stdout的任何内容,因此,如果您使用任何遗留命令,则必须将其输出通过管道输出到Write-Host:
Start-Transcript C:\logs\mylog.txt
Write-Host "Server: " $a
ping | Write-Host
Run Code Online (Sandbox Code Playgroud)
现有答案中有很好的信息,但让我尝试一个务实的总结:
当打印到控制台或重定向到一个文件,Write-Output分隔多个通过每个换行参数。
因此,为了生成单行输出,您必须将要输出的部分“预组装”为作为单个参数传递的单个字符串。
除了抑制集合的枚举,您通常不需要Write-Output显式使用,因为 PowerShell默认发送任何未在变量中捕获或重定向到其他地方或通过管道发送到[success] 输出流(Write-Output也写入) ; 因此,就目前的情况而言,以下内容就足够了:
"Server: $a" # what this expandable string expands to is *implicitly* output
Run Code Online (Sandbox Code Playgroud)
可能令人困惑的是Write-Hostcmdlet 的行为不同,但重要的是要注意它有不同的用途。
# IMPORTANT: Do not use Write-Host to output *data*; only use it to write
# directly to the host (console).
PS> Write-Host "Server:" $a # multiple spaces used on purpose
Server: srv1
Run Code Online (Sandbox Code Playgroud)
Write-Host,与 不同Write-Output,将多个参数分别用一个空格分隔。
还有其他重要的区别,在我的这个答案中进行了总结。
鉴于问题的通用标题,让我们还讨论如何抑制尾随换行符:
对于仅打印到控制台,您可以使用Write-Host -NoNewline.
使用数据输出,无论是通过Write-Output、隐式输出还是来自另一个命令:
将输出发送到控制台时,您无法阻止尾随换行符。
不幸的是,从 Windows PowerShell v5.1 / PowerShell Core v6.0.0 开始,在通过管道向外部程序发送文本时,您无法阻止尾随换行符- 请参阅此 GitHub 问题。
但是,在 PSv5+ 中,您可以通过使用或(在 PSv4- 中,您必须直接使用 .NET Framework)来防止在捕获文件中的输出时出现尾随换行符;相比之下,重定向到一个文件确实会附加一个尾随换行符。Out-File -NoNewlineSet-Content -NoNewline>
-NoNewline不仅会抑制尾随换行符,还会抑制这些对象之间的换行符。Out-File,并Set-Content当选择哪个,看到这个答案我的。| 归档时间: |
|
| 查看次数: |
28576 次 |
| 最近记录: |