多次写输出

时间:2017-01-24 14:27:53

标签: powershell

我试图编写一个比较两个变量的PowerShell脚本,一个包含当前正在运行的服务列表,另一个包含应该查看差异的预定义列表。 我想显示差异,同时还显示正在运行的当前服务。

$compared = Compare-Object $spServices $spServices23 -SyncWindow 0
Write-Output $compared

if($sTask -eq "Read")
{

    foreach ($spService in $spServices)
    {
        $out = new-object psobject
        $out | add-member noteproperty TypeName $spService.TypeName
        $out | add-member noteproperty Status $spService.Status
        Write-Output $out
    }

}

但是,当我输出Compare-Object结果时,它会显示它们,但是对于$ out变量的输出,它会变为空白。 任何帮助我如何做到这一点,同时保持输出格式化。

1 个答案:

答案 0 :(得分:5)

PowerShell始终尽力确保将输出转换为最有用的格式。其中一种方法是通过查看它首先在函数中显示的对象类型,并确保所有未来对象也匹配此格式。有时它是可能的,有时它不是。

对于您的代码,PowerShell会执行然后尝试发出Compare-Object的结果,然后成功。 'Compare-Object'发出一个具有这些属性的对象。

Name          MemberType   Definition                                                         
----          ----------   ----------                                                         
Equals        Method       bool Equals(System.Object obj)                                     
GetHashCode   Method       int GetHashCode()                                                  
GetType       Method       type GetType()                                                     
ToString      Method       string ToString()                                                  
InputObject   NoteProperty System.ServiceProcess.ServiceController InputObject=AdobeARMservice
SideIndicator NoteProperty string SideIndicator==>                                            

这些属性为此命令中可以发出的内容设置了舞台,除非你做了一些花哨的技巧。您查看后续命令输出的原因是它们不会输出相同的属性。

为了说明这个问题,请参阅以下代码:

function Ham2{
        [pscustomobject]@{Name='FoxDeploy';Job="Coder"}

        [pscustomobject]@{Name='Ham';Profession="Coder"}

}

执行此操作时,发出的FIRST对象的属性将确定稍后在代码中显示的内容。例如:

>ham2

Name      Job  
----      ---  
FoxDeploy Coder
Ham            

解决此问题

有几种方法可以解决这个问题。

首先,PowerShell最佳实践是您的脚本只应发出一种类型的对象。这就是函数在其帮助和.OUTPUT中有[CmdletBinding()]声明的原因,PowerShell期望命令只发出一种类型的对象,可能还有一些-Verbose或ErrorStream消息。

如果您真的想要发出两种类型的对象,则可以确保第一个对象具有您可能想要显示的所有属性。回到我之前的示例,如果我向第一个对象添加了Profession属性,现在我的第二个对象的Profession属性现在将变为可见。

 function Ham2{
        [pscustomobject]@{Name='FoxDeploy';Job="Coder";Profession=''}

        [pscustomobject]@{Name='Ham';Profession="Coder"}

}

PS C:\Users\Stephen> ham2

Name      Job   Profession
----      ---   ----------
FoxDeploy Coder           
Ham             Coder     

可能是您想要的但不推荐

如果您真的想要发出两种或更多种不同类型的对象(你肯定不会,正确?),那么你可以使用Format-List或{来绕过这个怪癖{1}}。请注意:这些将输出转换为文本格式化命令,您将丢失对象属性,人们通常会认为这是一件很麻烦的事情。但它将起作用

Format-Table

我希望有所帮助!如果您希望我深入潜水或出于某种原因希望我留在这个肥皂盒中,请告诉我: - )