【问题标题】:Powershell 2.0 random $null addition from Add-Member来自 Add-Member 的 Powershell 2.0 随机 $null 添加
【发布时间】:2017-07-10 23:13:27
【问题描述】:

我的目标是将一些信息保存到稍后将被写出的变量中 ($Server)。 我创建了一个从 CPU 获取一些信息的 cmdlet,它为我提供了我想要添加到我的服务器变量中的结果。 当我添加它时,我得到一个 $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 放在里面,如果它是一些有用的信息,我该如何更改它?

稍后我将创建一个 .json 文件来存储我的 $Server 变量,并将空值保存在其中。

我真的不喜欢我的用户收到预期没有的空值的想法。

编辑: 我已经制作了这个我使用的自定义 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
}

【问题讨论】:

  • @wOxxOm 我试过你的线路。但是它仍然给了我 $null 值:{$null, @{CPUSpecification=Intel... etc.
  • @wOxxOm 我添加了 Get-CPUInfo。但是,它确实给了我需要的信息,并且没有 $null 值,如第一个代码示例所示。
  • @MikeHjortChristensen 从Get-CPUInfo 中删除裸露的$SocketInfo 行——这是以$null 发出的那一行

标签: arrays powershell-2.0 psobject


【解决方案1】:

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

  • 让我们检查一下:

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

    Object[] System.Array

    (Get-CPUInfo -Computername .).Count
    

    2

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

    是的

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

    $SocketInfo
    

    删除它。

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多