PowerShell - Eigenschaften eines PS-Befehls in .txt Datei nutzen
Hallo Zusammen,
ich arbeite derzeit an einem PS-Script, um installierte Software zu inventarisieren.
Der Ablauf sieht wie folgt aus:
1. Jegliche Software eines Clients inventarisieren (lokal ausgeführt)
1.1 Output in ClientXY.txt file
2. ClientXY.txt file auf File-Server Freigabe kopieren
3. Output einer bestimmten Software in "Summary.txt file" speichern
3.3 Enthalten sind Computername, AppName, Version
Somit gibt es auf dem File-Server dann einen Ordner mit x ClientXY.txt Dateien die Auskunft über die installierte Software geben + eine Summary Datei die lediglich Auskunft über eine ganz bestimmte Software gibt. Das funktioniert auch soweit.
Nur möchte ich in der Summary Datei nicht selbst zählen welcher Client welche Version nutzt.
Ich möchte am Anfang dieser Datei eine Übersicht haben: "Von der Software X sind folgende Versionen in Umlauf: abc, xyz; X clients nutzen Version abc, X Clients nutzen Version xyz"
Mein Problem ist, dass ich nachdem ich die ClientsXY.txt Datei der jeweiligen Clients erstellt und auf den File-Server kopiert habe, keine Eigenschaften mehr nutzen kann die durch den PS-Befehl (Get-CimInstance win32_product) erzeugt werden. Somit finde ich momentan keine Möglichkeit in diesen Dateien nach der Version der bestimmten Software zu suchen, bzw. diese auszuwählen und in die Summary Datei zu schreiben. Die richtige Software in allen ClientXY.txt Dateien zu finden ist kein problem. Das löse ich mit:
Hier habe ich jetzt einen String mit allen Infos zu dieser Software, dass soll auch so sein/bleiben. Aber mir fehlt einfach die Möglichkeit nur nach den Versionen der bestimmten Software zu filtern/suchen.
Wie kann ich sinnvoll vorgehen, um nur die Versionen der bestimmten Software zu sammeln und in die Summary Datei zu schreiben ?
Das ganze Script sieht so aus:
ich arbeite derzeit an einem PS-Script, um installierte Software zu inventarisieren.
Der Ablauf sieht wie folgt aus:
1. Jegliche Software eines Clients inventarisieren (lokal ausgeführt)
1.1 Output in ClientXY.txt file
2. ClientXY.txt file auf File-Server Freigabe kopieren
3. Output einer bestimmten Software in "Summary.txt file" speichern
3.3 Enthalten sind Computername, AppName, Version
Somit gibt es auf dem File-Server dann einen Ordner mit x ClientXY.txt Dateien die Auskunft über die installierte Software geben + eine Summary Datei die lediglich Auskunft über eine ganz bestimmte Software gibt. Das funktioniert auch soweit.
Nur möchte ich in der Summary Datei nicht selbst zählen welcher Client welche Version nutzt.
Ich möchte am Anfang dieser Datei eine Übersicht haben: "Von der Software X sind folgende Versionen in Umlauf: abc, xyz; X clients nutzen Version abc, X Clients nutzen Version xyz"
Mein Problem ist, dass ich nachdem ich die ClientsXY.txt Datei der jeweiligen Clients erstellt und auf den File-Server kopiert habe, keine Eigenschaften mehr nutzen kann die durch den PS-Befehl (Get-CimInstance win32_product) erzeugt werden. Somit finde ich momentan keine Möglichkeit in diesen Dateien nach der Version der bestimmten Software zu suchen, bzw. diese auszuwählen und in die Summary Datei zu schreiben. Die richtige Software in allen ClientXY.txt Dateien zu finden ist kein problem. Das löse ich mit:
Get-ChildItem -Path $AppFiles -Recurse -Exclude "_*.txt" | Get-Content | Select-String -Pattern $inv
Wie kann ich sinnvoll vorgehen, um nur die Versionen der bestimmten Software zu sammeln und in die Summary Datei zu schreiben ?
Das ganze Script sieht so aus:
############################################ Variablen ##############################################################
$date = Get-Date
$Text = "Software Inventory was created on $env:COMPUTERNAME at $date."
$Apps = Get-CimInstance win32_product | Select-Object -Property @{n='Computername';e={[string]($env:COMPUTERNAME)}},Name,Version
$localPath = "C:\Inventory\"
$UNCPath = "\\SRV-PSDEV\APPS"
$AppFiles = "$UNCPath\*.txt"
$sumFile = "$UNCPath\_Summary.txt"
$TestPath = Test-Path -Path $localPath
########################################### Create Summary Variable #################################################
$inv = "VMware remote"
$AppArray = @()
########################################### Create Software Inventory ###############################################
if($TestPath -match "true")
{
$AppArray += $Text
$AppArray += $Apps
$AppArray | Out-File "$localPath\$env:COMPUTERNAME.txt"
Copy-Item -Path "C:\Inventory\$env:computername.txt" -Destination $UNCPath -Force
}
else
{
New-Item -Path "C:\Inventory\" -ItemType Directory
$AppArray += $Text
$AppArray += $Apps
$AppArray | Out-File "$localPath\$env:COMPUTERNAME.txt"
Copy-Item -Path "C:\Inventory\$env:computername.txt" -Destination $UNCPath -Force
}
########################################### Collect Data from Inventory ################################################
$CLTFiles = Get-ChildItem -Path $AppFiles -Exclude "_*.txt"
$AppNmbr = Get-ChildItem -Path $AppFiles -Recurse -Exclude "_*.txt" | Get-Content | Select-String -Pattern $inv
$AppCount = $AppNmbr.Count
$sumArray = @()
$sumArray += "$AppCount Clients nutzen $inv Software."
$sumArray += "-----------------------------------------------------------------------------------------------------------------------"
foreach($appfile in $CLTFiles.FullName)
{
$sumAppData = Get-ChildItem -Path $appfile -Recurse | Get-Content | Select-String -Pattern $inv
$sumArray += $sumAppData
}
$sumArray | Out-File $sumFile -Force
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 595125
Url: https://administrator.de/contentid/595125
Ausgedruckt am: 08.11.2024 um 13:11 Uhr
4 Kommentare
Neuester Kommentar
Am Client
Zur Auswertung (Gruppierung) der Anzahl und der jeweils genutzen Versionen (hier nur mal als Ausgabe auf der Konsole)
Get-CimInstance win32_product | Select @{n='Computername';e={$env:Computername}},Name,Version | export-csv "\\Server\Share\$env:Computername.csv" -Delimiter ";" -Encoding UTF8
Zur Auswertung (Gruppierung) der Anzahl und der jeweils genutzen Versionen (hier nur mal als Ausgabe auf der Konsole)
ls '\\Server\Share\*.csv' -File | %{Import-CSV $_.Fullname -Delimiter ";"} | group Name,Version -NoElement
Sorry, blöder Tippfehler ist mir gerade erst aufgefallen, ist oben behoben.
Siehe mein Code oben, Group-Object ist dein Freund .