【问题标题】:Issue with output of Powershell functionPowershell函数的输出问题
【发布时间】:2017-03-29 02:33:54
【问题描述】:

我正在编写一个函数并观察输出的一些异常行为。

这是代码:

Function Get-CompInfo
{
    [Cmdletbinding()]
    PARAM 
    (
        [Parameter(ValueFromPipeline=$true)]
        [Alias('Comp', 'Host')]
        [string[]]$computername
    )


    Begin
    {

    }
    Process
    {
        if ($computername -eq $Null) {
                $computername=$env:computername
                $VerboseOut="No computer specified. Running against local computer $computername :"
        }
            Else {
                $VerboseOut="Getting information for computer $computername :"
        }
        Write-Verbose $VerboseOut
        $CompInfo=Get-WmiObject Win32_Computersystem -computername $computername 
        $OSInfo=Get-WmiObject Win32_OperatingSystem -computername $computername 
                $Properties = [ordered]@{
                'Input'=$computername
                'SystemName'=$CompInfo.Name
                'Manufacturer'=$CompInfo.Manufacturer
                'Model'=$CompInfo.Model
                'PhysicalMemory'=$CompInfo.TotalPhysicalMemory
                'LogicalProcessors'=$CompInfo.NumberOfLogicalProcessors
                'OSCaption'=$OSInfo.Caption
                'OSArchitecture'=$OSInfo.OSArchitecture
                'ServicePackMajorVersion'=$OSInfo.ServicePackMajorVersion}

        # Output Information
        $obj=New-Object -TypeName PSobject -Property $Properties
        write-output $obj 

    }
    End
    {

    }
}

当从管道传递参数时:

"karuma", "本地主机" |获取CompInfo

Input                   : {karuma}
SystemName              : KARUMA
Manufacturer            : Hewlett-Packard
Model                   : h9-1400a
PhysicalMemory          : 17115000832
LogicalProcessors       : 8
OSCaption               : Microsoft Windows 10 Pro
OSArchitecture          : 64-bit
ServicePackMajorVersion : 0

Input                   : {localhost}
SystemName              : KARUMA
Manufacturer            : Hewlett-Packard
Model                   : h9-1400a
PhysicalMemory          : 17115000832
LogicalProcessors       : 8
OSCaption               : Microsoft Windows 10 Pro
OSArchitecture          : 64-bit
ServicePackMajorVersion : 0

当我传递带有计算机名称列表的文本文件时,我得到了相同类型的输出。

当指定多个主机名时:

Get-CompInfo -computername localhost, karuma

Input                   : {localhost, karuma}
SystemName              : {KARUMA, KARUMA}
Manufacturer            : {Hewlett-Packard, Hewlett-Packard}
Model                   : {h9-1400a, h9-1400a}
PhysicalMemory          : {17115000832, 17115000832}
LogicalProcessors       : {8, 8}
OSCaption               : {Microsoft Windows 10 Pro, Microsoft Windows 10 Pro}
OSArchitecture          : {64-bit, 64-bit}
ServicePackMajorVersion : {0, 0} 

我希望在传递多个值时看到表格输出,就像通过管道到格式表看到的那样。

任何关于我需要更改以获得所需输出的帮助将不胜感激。

【问题讨论】:

    标签: function powershell


    【解决方案1】:

    这是您设置函数的方式...当使用管道时,PROCESS 块将为管道中的每个对象运行一次 - 在这种情况下,$computername 参数一次只包含一个对象。

    当您在 $computername 参数中指定两台计算机时,您正在更改整个函数的运行方式,因为它包含两个对象。

    通过像这样将函数包装在 Foreach 中很容易解决:

    Function Get-CompInfo
    {
        [Cmdletbinding()]
        PARAM 
        (
            [Parameter(ValueFromPipeline=$true)]
            [Alias('Comp', 'Host')]
            [string[]]$computername
        )
    
        Begin {}
        Process
        {
            Foreach ($computer in $computername) {
                if ($computer -eq $Null) {
                        $computer=$env:computername
                        $VerboseOut="No computer specified. Running against local computer $computer :"
                }
                    Else {
                        $VerboseOut="Getting information for computer $computer :"
                }
                Write-Verbose $VerboseOut
                $CompInfo=Get-WmiObject Win32_Computersystem -computername $computer 
                $OSInfo=Get-WmiObject Win32_OperatingSystem -computername $computer 
                        $Properties = [ordered]@{
                        'Input'=$computer
                        'SystemName'=$CompInfo.Name
                        'Manufacturer'=$CompInfo.Manufacturer
                        'Model'=$CompInfo.Model
                        'PhysicalMemory'=$CompInfo.TotalPhysicalMemory
                        'LogicalProcessors'=$CompInfo.NumberOfLogicalProcessors
                        'OSCaption'=$OSInfo.Caption
                        'OSArchitecture'=$OSInfo.OSArchitecture
                        'ServicePackMajorVersion'=$OSInfo.ServicePackMajorVersion}
    
                # Output Information
                $obj=New-Object -TypeName PSobject -Property $Properties
                write-output $obj 
            }
        }
        End {}
    }
    

    【讨论】:

    • Dom Jones 有一篇很棒的文章用很好的例子解释了这种行为:technet.microsoft.com/en-us/library/hh413265.aspx
    • 嘿,詹姆斯,非常感谢!不敢相信我忽略了这一点,但让它工作了,并且能够通过 select 等传递属性。那篇文章看起来也很有趣,会去看看!
    猜你喜欢
    • 1970-01-01
    • 2013-12-29
    • 2013-06-11
    • 1970-01-01
    • 2022-07-22
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多