2016-06-03 13 views
1

Ich versuche, einige Systeminformationen von Domänencomputern zu erhalten. Ich führe dieses Skript, aber es endet nie.Was ist mit diesem PowerShell-Skript falsch?

Das Skript generiert die Computernamen in eine Textdatei, aber dann scheitert es die benötigten Informationen von jedem Computer zu erhalten.

Ich bin sicher, dass etwas im Skript fehlt, aber ich bin nicht ganz mit PS-Scripting vertraut.

Jede Hilfe würde sehr geschätzt werden.

# Get a list of all computer names and export to text file 
Get-ADComputer -Filter * -Property * | Select -Expand Name | Out-File Z:\test.txt 

#Get the computer name and find the below infromation for each individual computer 

get-content -path z:\test.txt | % { 

$computerSystem = get-wmiobject Win32_ComputerSystem 
$computerOS = get-wmiobject Win32_OperatingSystem 
$computerCPU = get-wmiobject Win32_Processor  
$computerHDD = Get-WmiObject Win32_LogicalDisk -Filter drivetype=3 } 

#Prepare the below information for a CSV file 
$csvObject = New-Object PSObject -property @{ 
    'PCName' = $computerSystem.Name  
    'Manufacturer' = $computerSystem.Manufacturer  
    'Model' = $computerSystem.Model 
    'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)  
    'HDDSize' = "{0:N2}" -f ($computerHDD.Size/1GB)  
    'HDDFree' = "{0:P2}" -f ($computerHDD.FreeSpace/$computerHDD.Size) 
    'CPU' = $computerCPU.Name  
    'OS' = $computerOS.caption  
    'User' = $computerSystem.UserName  
    'BootTime' = $computerOS.ConvertToDateTime($computerOS.LastBootUpTime) 
} 

#Export the fields you want from above in the specified order 

$csvObject | Select User, Model, PCName, OS, CPU, Ram | Export-Csv 'system-info.csv' -NoTypeInformation -Append 
} 

Antwort

0

Sie haben eine gebrochene Schleife, die auf der $computerHDD Linie am } schließt es die gleichen Variablen immer und immer wieder überschreibt, ohne die Daten zu verwenden und ein gebrochener Set von „Get-WMIObject“ Anrufe, die nie versuchen kontaktieren Sie irgendwelche entfernten Computer.

Und ein bisschen einer Verschwendung Design alle Eigenschaften greifen und sie wegzuwerfen, in eine Datei gespeichert und neu geladen, berechnend 10 Objekte dann 6.en

Und einen gebrochenen Export zu halten, die nur ein Objekt zu exportieren versucht, und sieht so aus, als ob es in der Schleife sein soll (mit dem Export-Append), aber ist nicht in der Schleife, und wäre klobig, wenn es war.

Ich kann nicht sehen, warum es nie zu Ende, aber das ist, warum es nicht richtig funktionieren kann.


Mein Rewrite Versuch wäre:

Get-ADComputer -Filter * | ForEach { 

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name 
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name 
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name 

    [PSCustomObject]@{ 
     'PCName' = $computerSystem.Name  
     'Model' = $computerSystem.Model 
     'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)  
     'CPU' = $computerCPU.Name  
     'OS' = $computerOS.caption  
     'User' = $computerSystem.UserName  
    } 

} | Export-Csv 'system-info.csv' -NoTypeInformation 

Die Get-WMIObject jetzt Anrufe an Remote-Computer verbinden, wobei die Schleife berechnet nur die PSCustomObject nur mit den Eigenschaften, die Sie interessieren, jene, fallen aus der Pipeline, und die gesamte Ausgabe aller benutzerdefinierten Objekte wird am Ende in einem Vorgang in CSV exportiert.

+0

Vielen Dank. Das Skript lief perfekt, als ich es heute getestet habe. Ich habe versucht, den Computern eine Ping-Option hinzuzufügen und nur Details von den Computern zu erhalten, die online sind. Wie erreiche ich das? –

+0

Wenn ich Folgendes hinzufüge: get-content Z: \ test.txt Wenn {Test-connection $ _} Else {"$ _ ist down"} –

+0

Mehr wie 'Get-Content z: \ test.txt | ForEach {if (Test-Verbindung $ _) {"$ _ ist up"} else {"$ _ ist down"}} ' – TessellatingHeckler