syntax1001
Goto Top

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:
Get-ChildItem -Path $AppFiles -Recurse -Exclude "_*.txt"  | Get-Content | Select-String -Pattern $inv  
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:
############################################ 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

Content-Key: 595125

Url: https://administrator.de/contentid/595125

Printed on: April 26, 2024 at 07:04 o'clock

Mitglied: 145033
Solution 145033 Aug 10, 2020 updated at 09:56:55 (UTC)
Goto Top
Am Client
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  
Mitglied: 145033
145033 Aug 10, 2020 updated at 09:56:21 (UTC)
Goto Top
Sorry, blöder Tippfehler ist mir gerade erst aufgefallen, ist oben behoben.
Member: SYNTAX1001
SYNTAX1001 Aug 11, 2020 at 11:04:59 (UTC)
Goto Top
Hallo Kleiber,

vielen Dank für die Hilfe. Nun habe ich aber ein weiteres Problem...
$UNCPath    = "\\SRV-PSDEV\APPS"  
$AppFiles   = "$UNCPath\*.csv"  
$inv        = "VMware"  
$AllApps    = ls $AppFiles -File | %{Import-Csv $_.FullName -Delimiter ";"} | Select Computername,Name,Version  
$Apps       = $AllApps | Where-Object {$_.Name -match $inv}

Ich habe in der Variable $Apps nun alle Informationen die ich brauche und kann mit $Apps.Version auch ganz einfach nach den Versionen filtern. Allerdings möchte ich nun zu Anfang der "Summary Datei" eine Übersicht der verschiedenen Versionen haben.
Sprich, "Diese Versionen sind in Umlauf: Version X, Version Y, Version Z; Version X ist x mal installiert, Version Y ist x mal installiert, usw...".

Aber wie löse ich das am besten ? Ich habe an eine if Bedingung innerhalb einer foreach-Schleife gedacht, nur fehlt mir da gerade die Vorstellungskraft für eine schicke Lösung.
Irgendwelche Ideen ?
Mitglied: 145033
145033 Aug 11, 2020 at 12:46:43 (UTC)
Goto Top
Siehe mein Code oben, Group-Object ist dein Freund face-wink.