Zuerst müssen Sie die Daten aus einer einzigen Verwendung von Get-WMIObject (gwmi) zu verwenden .
Wenn Sie mehrere Aufrufe mit GWMI ausführen, erstellen Sie jedes Mal einen anderen Snapshot der Daten und verwenden für jede Eigenschaft ein anderes Beispiel. Sie werden mit einer Tabelle von Daten enden, die zu einem kubistischen Picasso-Gemälde passen ... es wird nicht die ganze Liste ausrichten oder darstellen. Es dauert auch viel mehr Zeit, um die Prozessliste immer wieder zu erfassen und dann greifen nur eine einzelne Eigenschaft aus jeder verschiedenen Liste, so lohnt es sich, die Zeit zu nehmen, um eine einzige Reihe von Daten zu ändern, vor allem, wenn Sie am Ende neu zu verwenden Ihr Skript in einem umfangreichen Remote-Operations-Skript, das eine Datenbank mit Aufgaben kompiliert.
Es gibt verschiedene Möglichkeiten, nur die gewünschten Eigenschaften in Form von benutzerdefinierten PS-Objekten zu erfassen.Ich benutze Hash-Tabellen, um den Code kurz und einfach zu machen, und den Code zu machen efficient-- Sie bereits die verbage ausgeführt Sie für eine Hash-Tabelle getan hätten, in Form von:
$CPU = $Process.CPU
$WORKINGSET64 = $Process.WorkingSet64
$PEAKWORKINGSET64 = $Process.PeakWorkingSet64
$THREADS = $Process.Threads.Count
$HANDLES = $Process.Handles
$DESCRIPTION = $Process.Description
Also statt, nur
$taskProps = @{
'SID'=$task.SessionId
'Name'=$task.ProcessName
'PID'=$task.ProcessId
# add more properties here.
}
tun und stattdessen ein leeres benutzerdefiniertes Objekt zu schaffen, und dann ‚Schreiben‘, um es mehrmals mit
$obj = new-object psobject
$obj | add-member noteproperty "PID" ($PIDN)
$obj | add-member noteproperty "NAME" ($NAME)
$obj | add-member noteproperty "OWNER" ($OWNER)
$obj | add-member noteproperty "PATH" ($PATH)
$obj | add-member noteproperty "Command Line" ($CMD)
$obj | Add-Member noteproperty "SessionID" ($SESSIONID)
$obj | Add-Member noteproperty "CPU" ($CPU)
$obj | Add-Member noteproperty "WorkingSet64" ($WORKINGSET64)
$obj | Add-Member noteproperty "Peak Working Set64" ($PEAKWORKINGSET64)
$obj | Add-Member noteproperty "HANDLES" ($HANDLES)
$obj | Add-Member noteproperty "THREADS" ($THREADS)
$obj | Add-Member noteproperty "DESCRIPTION" ($DESCRIPTION)
können Sie die Eigenschaft hashtable verpacken und cr eate einen einzigen Schuss in das benutzerdefinierte Objekt am Ende:
$taskObject = New-Object -TypeName PSObject -Property $taskProps
Dann speichern Sie es in einem Arraylist mit
$taskList += $taskObject
Sie meinem Beispiel hier sehen können:
# Generates a collection of "System.Management.ManagementObject#root\cimv2\Win32_Process"
# Only do this once. Every time gwmi is used, it makes another RPC call if used remotely.
# If you do multiple GWMIs you'll be working with differing data samples.
$taskSnapshot = Get-WMIObject -ComputerName [machine name] -Class Win32_Process
# Initialize, nullify, and declare your list as an empty ArrayList.
$taskList = @()
# Begin formatting in prep of Format-Table or similar usage
# This is where you'd define each property you want to see, manipulation, etc.
foreach ($task in $taskSnapshot){
# Create the hash table which will temporarily store all information for each task naming/assigning only
# properties you want to display.
$taskProps = @{
'SID'=$task.SessionId
'Name'=$task.ProcessName
'PID'=$task.ProcessId
# additional properties here.
}
# "Packages" the new custom object in a variable that stores the object
$taskObject = New-Object -TypeName PSObject -Property $taskProps
# append (addition) operation on formerly defined arraylist to store
# the packaged object to an arraylist.
$taskList += $taskObject
}
# Displays the list of task "objects" in a table, other formatting options are available online.
$taskList | Format-Table -AutoSize
Format Befehle zum Ändern der Ausgabe Ansicht:
Windows Powershell: Die vielen Möglichkeiten, um ein benutzerdefiniertes Objekt:
https://technet.microsoft.com/en-us/magazine/hh750381.aspx
ich auch Out-Gridview Auschecken würde empfehlen, da es eine GUI-Tabelle der Daten schaffen Sie können die Größe ändern und einfach darin herumklicken.
Der wichtige Teil ist GWMI einmal zu verwenden. Es wäre besser, die rohen Informationen in einer einzelnen Variablen zu erfassen und dann die Select-String/where/if-/Bearbeitungs- und Formatierungsoperationen für das Dataset in Ihrer foreach-Anweisung auszuführen.
Hier ist die saubere Kopie des Beispiels mit meinen ausgewählten Aliase.
$taskSnapshot = gwmi -cn localhost -class win32_process
$taskList = @()
foreach ($task in $taskSnapshot){
$taskProps = @{
'SID'=$task.SessionId
'Name'=$task.ProcessName
'PID'=$task.ProcessId
}
$taskObject = New-Object -TypeName PSObject -Property $taskProps
$taskList += $taskObject
}
$taskList | Out-GridView
Eine andere Sache, jemand erwähnt ist die Min-/Max-Eigenschaften Workingset ...
Sie können alle Eigenschaften von Win32_Process sehen von
tun
Get-WMIObject -Class Win32_Process | Get-Member
oder
gwmi -cl win32_process | gm
Lieber Nickolai, ich danke Ihnen sehr für Get-Counter Hinweis, es hat mir wirklich geholfen, ich einige Daten von dort verwendet – Senator14