当前位置:  开发笔记 > 编程语言 > 正文

多次写输出

如何解决《多次写输出》经验,为你挑选了1个好方法。

我正在尝试编写一个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> FoxDeploy..:

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或者绕过这个怪癖Format-Table.请注意:这些将输出转换为文本格式化命令,您将丢失对象属性,人们通常会认为这是一件很麻烦的事情.但它会奏效.

    function iFeelIcky{
    $spservices = gsv AdobeARMservice,bits
    $compared = Compare-Object (get-service bits,winrm) $spservices -SyncWindow 0
    $compared | Format-Table


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

    }

C:\Users\Stephen> iFeelIcky

InputObject     SideIndicator
-----------     -------------
AdobeARMservice =>           
bits            <=           
bits            =>           
winrm           <=           



DisplayName                              Status
-----------                              ------
Adobe Acrobat Update Service            Running
Background Intelligent Transfer Service Running
}

我希望有所帮助!让我知道,如果你想让我深入潜水或出于某种原因希望我留在这个肥皂盒:-)

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有