2016-05-11 3 views
0

Ich habe eine Anfrage erhalten, diese auf jedem meiner Systeme auszuführen, die eine Liste der installierten Anwendungen abruft und sie in eine Textdatei ausgibt. Ich muss dann all diese Dinge zu etwas Lesbarem kombinieren, was eine Weile dauern wird. Ich lerne, Powershell und will dies von einem System ausgeführt machen wird, aus einer Liste von Servern in einer Textdatei ziehen und diese Abfrage von einem Ort gegen alle Systeme läuft:Wie verwandle ich diesen einfachen Befehl in etwas, das aus einer Liste entfernter Systeme springt?

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize > "$Env:userprofile\desktop\Installed Programs for $env:computername.txt" 

Ich habe zu arbeiten beginne darauf denke ich aber, dass ich etwas vermisse, um dies zur Arbeit zu bringen. Ich bin derzeit dabei, diese an eine Zeichenfolge zu leiten, um sie dann an einen CSV auszugeben (ich bin offen für Vorschläge). Das habe ich bisher.

# Computer running this script 
$WhoAmI = $env:ComputerName 

$ServerList = get-content -path "C:\scripts\ServerList.txt" 
$Path = "C:\scripts\results" 

foreach ($server in $ServerList) 
    { 

     $InstalledApps = Invoke-Command -ComputerName $server {Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* } 

      $Results += $InstalledApps | 
       Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | 
        Out-String 


    } 
Write-Host $InstallApps 

# $InstallApps | export-csv "$Path\InstalledFiles.csv" 

Ich prüfe derzeit die Funktionalität der Schleife, indem ich nur versuche, es auf den Bildschirm zu schreiben. Ich bekomme nur eine leere Antwort.

Antwort

0

Sie waren immer Ausgang nicht, weil Sie die (undefined) Variable $InstallApps anstelle der variablen $results verwendet.

Mit diesem gesagt, würde ich String-Verkettung in einer Schleife nicht empfehlen. So etwas wäre ein eleganterer Ansatz:

Get-Content -Path 'C:\scripts\ServerList.txt' | ForEach-Object { 
    $server = $_ 
    Invoke-Command -ComputerName $server -ScriptBlock { 
     Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* 
    } | Select-Object @{n='Server';e={$server}}, DisplayName, DisplayVersion, 
         Publisher, InstallDate 
} | Export-Csv 'C:\scripts\results\InstalledPrograms.csv' -NoType 
+0

Das sieht interessant aus und ich werde es versuchen. Ich erkannte meinen Fehler oben (siehe mein Update unten) und funktionierte mit txt-Formatierung, aber es ist hässlich Ausgabe (nicht die Schuld des Skripts. So ist es, wenn Sie den Solo-Befehl verwenden). –

+0

Funktioniert wie ein Charme. Ich schätze das sehr. Ich lerne immer noch Powershell und ich habe eine Vorlage, wie Arrays wie diese zu tun und die Ergebnisse in eine CSV auszugeben. Sehr hilfreich. Vielen Dank! –

0

Ich habe es irgendwie herausgefunden. Ausgeruhte Augen an einem frischen Tag. Einige Fehler in dem, was ich schreibe usw. Ich bin offen für Verbesserungen, wenn jemand etwas beizutragen hat.

EDIT: Ich habe es funktioniert hauptsächlich mit den folgenden, aber die Ausgabe ist chaotisch. Offen für Vorschläge.


# Computer running this script 

$ServerList = get-content -path "C:\scripts\ServerList.txt" 
$Path = "C:\scripts\results" 

foreach ($server in $ServerList) 
    { 

    $Results += "Results for $server" 

     $InstalledApps = Invoke-Command -ComputerName $server -ScriptBlock {Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* } 

      $Results += $InstalledApps | 
       Select DisplayName, DisplayVersion, Publisher, InstallDate | 
        Out-String 


    } 

# Write-Host $Results 

$Results | out-file -filepath "$Path\InstalledPrograms.txt" -width 200 
Verwandte Themen