none
Powershell Get-WmiObject -win32_processor RRS feed

  • Frage

  • Hallo Zusammen,

    ich bin noch neu in der Powershell Welt und habe ein Script gefunden und angepasst, welches mir für vorgegebene PCs, die Prozessoren auslesen soll.

    Funktioniert auch soweit ganz gut, allerdings ist bei "Computer2" der Prozessor von Computer1. Das ist um eine Stelle verrückt. Findet jemand den Fehler in dem Script.

    Zudem würde ich das ganze gerne am Ende als .csv exportieren. Wie muss ich das machen?

    Das Script:

    $ArrComputers = , "bre-pc-10", "bre-pc-11", "bre-pc-13", "bre-pc-08", "bre-pc-11"
    foreach ($Computer in $ArrComputers)
    {
    write-host ""
    write-host "Computer: $Computer" - "Prozessor: $ColItems"
    
    $ColItems = Get-WmiObject -Class win32_processor -Namespace "root\cimv2" -Computer $Computer | Select "Name" 
    }

    Vielen Dank im Voraus.

    Viele Grüße

    Tobias

    Mittwoch, 24. Januar 2018 08:20

Antworten

  • Hallo Tobias,

    So sollte das klappen (ungetestet):

    $ArrComputers = , "bre-pc-10", "bre-pc-11", "bre-pc-13", "bre-pc-08", "bre-pc-11" $ColItems = @() foreach ($Computer in $ArrComputers) { $ColItems += Get-WmiObject -Class win32_processor -Namespace "root\cimv2" -Computer $Computer | Select "Name" } $ColItems | Export-Csv -LiteralPath "C:\my\path\export.csv" -NoTypeInformation

    Du hast die Variable $ColItems immer überschrieben, anstatt ein Array daraus zu machen.

    Export-Csv exportiert dir das Array in ein CSV File.

    Gruss,
    Tobias



    • Bearbeitet TobyU Mittwoch, 24. Januar 2018 08:33
    • Als Antwort markiert TobiasHan Mittwoch, 24. Januar 2018 10:03
    Mittwoch, 24. Januar 2018 08:31
  • Du hängst beim Select-Object noch die Property PSComputerName mit an.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 24. Januar 2018 12:12
    • Als Antwort markiert TobiasHan Mittwoch, 24. Januar 2018 12:22
    Mittwoch, 24. Januar 2018 12:12

Alle Antworten

  • Gewinne ich was, wenn ich den Fehler finde?  :-D ;-)

    Du füllst die Variable $ColItems erst nachdem Du sie in Deiner Schleife zur Ausgabe benutzt. Also kommt der Inhalt erst beim nächsten Schleifendurchlauf zum Vorschein.

    Noch'n Tipp zum Thema Write-Host: Write-Host Considered Harmful


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 24. Januar 2018 08:30
  • Hallo Tobias,

    So sollte das klappen (ungetestet):

    $ArrComputers = , "bre-pc-10", "bre-pc-11", "bre-pc-13", "bre-pc-08", "bre-pc-11" $ColItems = @() foreach ($Computer in $ArrComputers) { $ColItems += Get-WmiObject -Class win32_processor -Namespace "root\cimv2" -Computer $Computer | Select "Name" } $ColItems | Export-Csv -LiteralPath "C:\my\path\export.csv" -NoTypeInformation

    Du hast die Variable $ColItems immer überschrieben, anstatt ein Array daraus zu machen.

    Export-Csv exportiert dir das Array in ein CSV File.

    Gruss,
    Tobias



    • Bearbeitet TobyU Mittwoch, 24. Januar 2018 08:33
    • Als Antwort markiert TobiasHan Mittwoch, 24. Januar 2018 10:03
    Mittwoch, 24. Januar 2018 08:31
  • .... und bevor ich's vergesse: Du könntest Dir Dein Leben auch noch etwas einfacher machen. Sowohl Get-WMIObject als auch die modernere Variante Get-CimInstance nehmen für den Parameter -ComputerName auch ein Array von ComputerNamen entgegen. Dein Code auf das Nötigste redurziert wäre also sowas hier:

    $ArrComputers = , "bre-pc-10", "bre-pc-11", "bre-pc-13", "bre-pc-08", "bre-pc-11"
    Get-CimInstance - ClassName cim_processor -ComputerName $ArrComputers

    Das kannst Du dann natürlich in eine Variable speichern oder als CSV exportieren ...  ganz nach Belieben.

    Wenn Du, aus welchem Grund auch immer, trotzdem unbedingt eine Schleife benutzen möchtest, solltest Du die Variable $ColItems vor die Schleife packen - nicht in die Schleife. Also so ungefähr:

    $ArrComputers = , "bre-pc-10", "bre-pc-11", "bre-pc-13", "bre-pc-08", "bre-pc-11"
    $ColItems = foreach ($Computer in $ArrComputers){
        Get-CimInstance -ClassName CIM_Processor -ComputerName $Computer
    }


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 24. Januar 2018 08:55
    Mittwoch, 24. Januar 2018 08:51
  • Hi TobyU,

    danke, das klappt.

    Nur wenn Zeit und Lust da ist:

    Magst du mir erklären, was das @() und das "+= Get-..." bewirkt?

    Viele Grüße

    Mittwoch, 24. Januar 2018 10:04
  • Klar :-)

    $variable = @() instanziert ein Array und mit $variable += "mein Wert" fügst Du dem Array ein weiteres Element hinzu.

    Schau Dir das mal an: https://ss64.com/ps/syntax-arrays.html

    Grüsse,
    Tobias

    Mittwoch, 24. Januar 2018 10:15
  • Magst du mir erklären, was das @() und das "+= Get-..." bewirkt?

    Das ist Powershell-Scripting von hinten durch die Brust ins Auge - funktioniert - ist aber unnötig. ;-) :-D

    $ColItems = @()

    erzeugt ein leeres Array und

     $ColItems += Get-WmiObject 

    hängt an das Array einen weiteren Eintrag an.

    Wenn Du Dir mein Beispiel mal anschaust, siehst Du, wie es ein bsisl einfacher geht.  ;-)


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    • Als Antwort vorgeschlagen TobyU Mittwoch, 24. Januar 2018 10:29
    Mittwoch, 24. Januar 2018 10:18
  • > Magst du mir erklären, was das @() und das "+= Get-..." bewirkt?

    http://lmgtfy.com/?q=powershell+%2B%3D  (SCNR...)

    @() initialisiert ein leeres Array. Damit ist sichergestellt, daß $ColItems auch ein Array wird und kein String, denn...

    ( += hängt das hinten an das vorne an. $a +=1 ist das gleiche wie $a = $a + 1 )

    ...wenn $ColItems kein Array ist sondern ein String, dann würde das immer nur ein längerer String werden...

    Mittwoch, 24. Januar 2018 10:38
  • Danke für eure Antworten. Die Ausgabe klappt perfekt.

    Danke für eure Zeit und eure Mühe.

    Eins hätte ich noch. Ich möchte in dem Excel-Dokument noch den Computernamen mit angegeben haben.

    Wie setze ich das um?

    Mittwoch, 24. Januar 2018 11:27
  • Du hängst beim Select-Object noch die Property PSComputerName mit an.

    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Mittwoch, 24. Januar 2018 12:12
    • Als Antwort markiert TobiasHan Mittwoch, 24. Januar 2018 12:22
    Mittwoch, 24. Januar 2018 12:12
  • Habs gefunden, Danke an alle.

    Funktioniert.

    Mittwoch, 24. Januar 2018 12:22
  • Für alle, die irgendwan mal so ein Skript suchen, hier mein Script, wenn auch mit veralteter Technik:

    Das Script liest aus der Datei "server.txt" die PCs aus und gibt dann im Excel-Dokument "Prozessor.csv" den Namen des Systems, den Namen des Prozessors, die ANzahl an Kerne, sowie Anzahl Logical Prozessoren aus, sowie den Status.

    $ArrComputers = Get-Content .\server.txt
    $ColItems = @()
    foreach ($Computer in $ArrComputers) {
       
        $ColItems += Get-WmiObject -Class win32_processor -Namespace "root\cimv2" -Computer $Computer | Select "SystemName", "Name", "NumberOfCores", "NumberOfLogicalProcessors", "Status"
        
    }
    
    $ColItems  | Export-Csv -LiteralPath .\prozessor.csv -NoTypeInformation

    Mittwoch, 24. Januar 2018 12:28