Powershell 多写输出

Powershell 多写输出,powershell,Powershell,我正在尝试编写一个PowerShell脚本,该脚本将比较两个变量,一个包含当前正在运行的服务列表,另一个包含应该查看差异的预定义服务列表。 我想在显示当前运行的服务的同时显示差异 $compared = Compare-Object $spServices $spServices23 -SyncWindow 0 Write-Output $compared if($sTask -eq "Read") { foreach ($spService in $spServices)

我正在尝试编写一个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对象结果时,它会显示它们,但是对于$out变量的输出,结果为空。
关于如何在保持输出格式的同时执行此操作的任何帮助

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

对于您的代码,PowerShell将执行,然后尝试发出
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==>                                            
这些属性为在该命令中也可以发出的内容设置了舞台,除非您使用一些奇特的技巧。没有看到后续命令的输出的原因是它们也没有输出相同的属性

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"}

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

>ham2

Name      Job  
----      ---  
FoxDeploy Coder
Ham            
解决这个问题

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

首先也是最重要的一点是,PowerShell的最佳实践是您的脚本应该只发出一种类型的对象。这就是为什么函数在其帮助和
[CmdletBinding()]
中有一个
.OUTPUT
声明,PowerShell希望命令只发出一种类型的对象,可能还发出一些
-Verbose
或错误流消息

如果确实要发射两种类型的对象,可以确保第一个对象具有可能要显示的所有特性。回到前面的示例,如果我在第一个对象中添加了
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     
可能是您想要但不推荐的内容

如果你真的想发射两种或两种以上不同类型的物体(你肯定不想,对吧?),那么你可以通过使用
格式列表
格式表
来绕过这个怪癖。请注意:这些命令会将输出转换为文本格式命令,您将丢失对象属性,人们通常会认为这是一件很不礼貌的事情。但它会起作用

函数iFeelIcky{
$spservices=gsv AdobeARMservice,位
$compared=比较对象(获取服务位,winrm)$spservices-SyncWindow 0
$compared |格式表
foreach($spServices中的spServices)
{
$out=新对象psobject
$out |添加成员noteproperty DisplayName$spService.DisplayName
$out |添加成员noteproperty状态$spService.Status
$out
}
}
C:\Users\Stephen>iFeelIcky
输入对象侧指示器
-----------     -------------
AdobeARMservice=>
位

winrm
\script.ps1 | fl
非常好的解释,+1!