从cmdlet返回日志输出和结果对象

时间:2017-04-04 10:06:31

标签: powershell

cmdlet的一般问题:处理cmdlet日志输出的最佳方法是什么。我已经读过使用Write-Host并不是一个好主意,因为它无法重定向到例如一份文件。因此,使用Write-Output来完成此任务似乎是有意义的。如果我还想返回一个"对象" (到管道)包括一些结果,它将与我的cmdlet的日志输出混合。因为日志输出和自定义结果对象都写入同一输出流。

处理此问题的好方法是什么?如果我想生成一些日志输出,我应该使用Write-Verbose吗?

1 个答案:

答案 0 :(得分:2)

  

处理cmdlet日志输出的最佳方法是什么

这实际上取决于脚本/ cmdlet或函数的目标。在一般意义上,您应该做的是允许最多的选项,并将其留给调用脚本/ cmdlet或函数来处理输出。如果您支持Write-Verbose切换(并且您应该),-Verbose会很好。如果您的代码已经需要使用标准输出流,那么您需要使用至少一个不同的代码来获取其他信息。详细似乎是一个很好的契合,但它实际上取决于信息代表什么。

  

我已经读过使用Write-Host并不是一个好主意,因为它无法重定向到例如一个文件。

v5不再适用。 Write-Host在这方面声名狼借,但主要是因为人们滥用它。 Ansgar Wiechers' Write-Host vs Write-Information in PowerShell 5上的回答很好地概述了不同的流。 Write-Information是一个明显的选择,您可以根据需要重定向。这是在PowerShell v5中引入的,因此您可能需要考虑可移植性问题。

只要你有PowerShell v3或更高版本,那么你可以将详细输出重定向到文件,如果你愿意的话,只留下标准输出流。

# Location for verbose output
$filename = "c:\temp\verbose.txt"
# Genereate standard, verbose and error output.
$result = $("Bagel";Write-Verbose "Verbose Output"; Write-Error "Error Output") 4> $filename
# Pipeline output will be in $var
$result
# Warning output is in the file
Get-Content $filename
  

处理此问题的好方法是什么?

重复:在代码中使用各种流放置尽可能多的必要输出,并允许调用者可选地启用它,这也允许它们根据具体情况重定向或抑制。