2017-02-21 2 views
0

Mein Ziel ist es, einige Informationen in eine Variable zu speichern, die später ausgeschrieben wird ($Server). Ich habe ein Cmdlet erstellt, das einige Informationen von der CPU erhält, was mir das Ergebnis gibt, das ich meiner Servervariablen hinzufügen möchte. Wenn ich es addiere, erhalte ich einen $null Wert.

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:\> 

Ich möchte wissen, warum ich diese $ null nach innen erhalten, und wie ändere ich es, wenn es einige nützliche Informationen ist?

Später werde ich eine .json-Datei erstellen, die meine $ Server-Variable speichert, und es speichert auch den Nullwert darin.

Ich mag wirklich nicht die Idee meiner Benutzer erhalten Null-Werte, wo keine erwartet werden.

EDIT: ich diese Gewohnheit gemacht haben, Get-CPUInfo Cmdlets, die ich benutze, aber es gibt mir, was ich brauche und kein $ null Wert:

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 
} 
+0

@wOxxOm Ich habe versucht Ihre Linie. Aber es gibt mir immer noch den $ Null-Wert: {$ null, @ {CPUSspezifikation = Intel ... etc. –

+0

@wOxxOm ich habe die Get-CPUInfo. Allerdings gibt es mir die Informationen, die ich brauche, und keine $ null-Werte, wie im ersten Codebeispiel gezeigt. –

+2

@MikeHjortChristensen Entfernen Sie die leere '$ SocketInfo'-Zeile von' Get-CPUInfo' - das ist die, die als '$ null' aussendet –

Antwort

1

Powershell nicht null Elemente eines Arrays nicht gedruckt Wenn Sie es direkt anzeigen, wird es jedoch in einer kompakten Darstellung der Eigenschaften gedruckt.

  • Lassen Sie uns:

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

    Object [] System.Array

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

    Wahr

  • Etwas gibt einen Nullwert in der Get-CPUInfo Funktion:

    $SocketInfo 
    

    es entfernen.