添加成员的Powershell 2.0随机$ null添加

时间:2017-02-21 11:00:22

标签: arrays powershell-v2.0 psobject

我的目标是将一些信息保存到稍后将被写出的变量中($Server)。 我创建了一个cmdlet,它从CPU获取一些信息,这给了我想要添加到我的服务器变量中的结果。 当我添加它时,我得到$null值。

PS C:\> $CPU = Get-CPUInfo -Computername .

PS C:\> $CPU

CPUSpecification                         CPUCurrentClockSpeed CPUMaxClockSpeed Socket                                                                   
----------------                         -------------------- ---------------- ------                                                                   
Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz                 2300             2400 {@{SocketDesignation=U3E1; NumberOfCores=2; NumberOfLogicalProcessors=4}}



PS C:\> $Server = New-Object PSObject

PS C:\> Add-Member -InputObject $Server -MemberType NoteProperty -Name "CPU" -Value $CPU

PS C:\> $Server

CPU                                                                                                                                            
---                                                                                                                                            
{$null, @{CPUSpecification=Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz; CPUCurrentClockSpeed=2300; CPUMaxClockSpeed=2400; Socket=System.Object[]}}



PS C:\> 

我想知道为什么我在里面得到这个$ null,如果它是一些有用的信息我怎么改变呢?

稍后我会创建一个存储我的$ Server变量的.json文件,它还会将null值保存在那里。

我真的不喜欢我的用户在没有预料到的情况下接收空值的想法。

编辑: 我已经使用了这个自定义的Get-CPUInfo cmdlet,但是它给了我我需要的东西并且没有$ null值:

function Get-CPUInfo
{
    [CmdletBinding()]
    Param
    (
        # Name of the computer to get version from
        [Parameter(Mandatory=$true,
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [ValidateNotNull()]
        [ValidateNotNullOrEmpty()]
        [Alias("CN", "Host", "HostName")]
        [string]$Computername
    )
    $MySocket = Get-WmiObject -Class Win32_Processor -ComputerName $ComputerName
    $IsSocketArray = $MySocket -is [system.array]

    $SocketInfo
    $SocketInfoArray = @()
    if(-not $IsSocketarray)
    {
        $SocketInfo = New-Object PSObject
        Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "SocketDesignation" -Value $MySocket.SocketDesignation
        Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "NumberOfCores" -Value $MySocket.NumberOfCores
        Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "NumberOfLogicalProcessors" -Value $MySocket.NumberOfLogicalProcessors

        $SocketInfoArray += $SocketInfo
    }
    else
    {
        foreach ($s in $MySocket)
        {
            $SocketInfo = New-Object PSObject
            Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "SocketDesignation" -Value $s.SocketDesignation
            Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "NumberOfCores" -Value $s.NumberOfCores
            Add-Member -InputObject $SocketInfo -MemberType NoteProperty -Name "NumberOfLogicalProcessors" -Value $s.NumberOfLogicalProcessors

            $SocketInfoArray += $SocketInfo
        }
    }

    $CPUSpecification = if($IsSocketarray){ $MySocket[0].Name} else{ $MySocket.Name}
    $CPUCurrentClockSpeed = if($IsSocketarray){ $MySocket[0].CurrentClockSpeed} else{ $MySocket.CurrentClockSpeed}
    $CPUMaxClockSpeed = if($IsSocketarray){ $MySocket[0].MaxClockSpeed} else{ $MySocket.MaxClockSpeed}

    $CPUInfo = New-Object PSObject
    Add-Member -InputObject $CPUInfo -MemberType NoteProperty -Name "CPUSpecification" -Value $CPUSpecification
    Add-Member -InputObject $CPUInfo -MemberType NoteProperty -Name "CPUCurrentClockSpeed" -Value $CPUCurrentClockSpeed
    Add-Member -InputObject $CPUInfo -MemberType NoteProperty -Name "CPUMaxClockSpeed" -Value $CPUMaxClockSpeed
    Add-Member -InputObject $CPUInfo -MemberType NoteProperty -Name "Socket" -Value $SocketInfoArray

    return $CPUInfo
}

1 个答案:

答案 0 :(得分:1)

当您直接显示数组时,PowerShell不会打印数组的空元素,但它将以紧凑的属性表示形式打印。

  • 我们来看看:

    (Get-CPUInfo -Computername .).GetType()
    
      

    Object [] System.Array

    (Get-CPUInfo -Computername .).Count
    
      

    2

    (Get-CPUInfo -Computername .)[0] -eq $null
    
      

  • Something在Get-CPUInfo函数中输出空值:

    $SocketInfo
    

    将其删除。