Benutzer mit den meisten Antworten
Powershell Get-WmiObject -win32_processor

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
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
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''
-
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
-
.... 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
-
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
-
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
-
> 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...
-
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