danielg1974
Goto Top

PowerShell: Erfassen und Übernehmen von Array-Elementen

Hallo.

Ich überarbeite und erweitere gerade ein PowerShell-Skript eines Kollegen.
Das komplette Skript liest aus einer Excel-Datei PDF-Dateien anhand von Links ein und erstellt mit Ghostscript ein komplettes PDF-Dokument.
Das funktioniert alles.

Da dieses Skript bei verschiedenen Anwendern zum Einsatz kommt, sind unter Umständen auch die Versionen von Ghostscript unterschiedlich.
Der Pfad zu Ghostscript unterscheidet sich demnach ebenfalls.
Der Pfad zu Ghostscript wird im Gesamt-Skript verwendet.

Nun bin ich dabei ein Teil-Skript zu erstellen, dass die Version von Ghostscript ermitteln soll und ggf. die aktuellere Version installiert.
Ich kann auch damit leben, dass das Skript den Pfad zur unterschiedlichen Version anpasst.

Womit ich aber ein Verständnisproblem habe:
Wie bekomme ich die Version von Ghostscript übernommen?
An den Zeilen und Spalten im Array kann ich mich ja schlecht orientieren, da es bei jedem Anwender unterschiedlich sein kann.
Ich bin den Weg über eine Text-Datei gegangen, in die ich die installierten Programme schreiben lasse.

Was ich bis jetzt habe:

<# Script zum Ermitteln, ob GhostScript installiert ist. #>

<# Host- und Computernamen ermitteln #>
$Benutzer = $env:USERNAME
$Hostname = $env:COMPUTERNAME

<# Software auslesen #>
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | select DisplayName, DisplayVersion | out-File C:\temp\installierte_software.txt

<# Leerzeichen und Leerzeilen aus der Textdatei entfernen #>
(Get-Content -Path C:\temp\installierte_software.txt) | Where-Object -FilterScript {$_.Trim() -ne '' } | Set-Content -Path C:\temp\installierte_software.txt  

<# Array anlegen #>
$SoftwareArray1 =@(Get-Content "C:\temp\installierte_software.txt")  

<# Inhalt des $SoftwareArray1 ausgeben #>
for ($i=0; $i -lt $SoftwareArray1.length; $i++)
{
    Write-Host $SoftwareArray1[$i]   
}

<# Textdatei nach Programm durchsuchen #>
Write-Host ("   ")  
for ($k=0; $k -lt $SoftwareArray1.length; $k++)
{
    $SoftwareArray1[$k].Contains("GPL Ghostscript")     
}

Ich habe unzählige Webseiten mit Powershell aufgesucht.
Keine konnte MIR verständlich erklären, wie ich den Wert der "DisplayVersion" übernehmen kann.
Oder hab ich hier ein Brett vorm Kopf, dass ich die Lösung nicht sehe?

Gruß
Daniel

P.S.: Bitte erstmal nur einen Tipp abgeben und nicht die komplette Lösung liefern. Ich will ja was lernen. face-smile

Content-Key: 1144217153

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

Printed on: April 27, 2024 at 13:04 o'clock

Mitglied: 149062
149062 Aug 11, 2021 updated at 10:41:15 (UTC)
Goto Top
Oder hab ich hier ein Brett vorm Kopf, dass ich die Lösung nicht sehe?
Jo.
Hol dir den Ghostscript Pfad gleich über den entsprechenden Registry-Pfad der Ghostscript DLL. Da du kein komplettes Script willst hier der Anfang den du ergänzen kannst
Get-ChildItem 'HKLM:\SOFTWARE\GPL Ghostscript' -Recurse | Get-ItemProperty -Name GS_DLL  
Den ganzen Schaderadatsch erst in ne Textdatei schreiben?? Mit Powershell doch vollkommen überflüssig....

Zum Thema installierte Software vollständig auslesen guckst du bspw. hier
Mit Powershell in der Reg. auslesen um den UninstallString zu bekommen
Member: emeriks
emeriks Aug 11, 2021 at 11:41:34 (UTC)
Goto Top
Hi,
kommst Du vielleicht damit weiter?
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | %{[version]$_.DisplayVersion}
Oder was meinst Du?

E.
Member: DanielG1974
DanielG1974 Aug 11, 2021 at 11:46:16 (UTC)
Goto Top
Danke für den Tipp.
Jetzt sieht es so aus:

<# Script zum Ermitteln, ob GhostScript installiert ist. #>

<# Host- und Computernamen ermitteln #>
$Benutzer = $env:USERNAME
$Hostname = $env:COMPUTERNAME

<# Software auslesen und als Array anlegen #>
$SoftwareGS =@(Get-ChildItem 'HKLM:\SOFTWARE\GPL Ghostscript' -Recurse | Get-ItemProperty -Name GS_DLL)  

<# Pfad zum Ghostscript-Programm erstellenn #>
# Write-Host $SoftwareGS.PSChildName
$SoftwareGSPath = ("C:\Program Files\gs\gs" + $SoftwareGS.PSChildName + "\")  
# Write-Host $SoftwareGSPath

Nun gehts weiter. Falls Ghostscript nicht installiert ist face-smile
Member: DanielG1974
DanielG1974 Aug 11, 2021 at 11:50:03 (UTC)
Goto Top
Das Problem mit den Uninstall-Pfaden in der Registry ist, dass dort nicht alle Anwendungen hinter einem Eintrag stecken.
32-Bit und 64-Bit Anwendungen sind unter Umständen in verschiedenen Registry-Pfaden hinterlegt.

Aber der Tipp von evoplus mit dem Link hilft da weiter.
Will man alle Anwendungen erwischen hilft das dortige function-Skript weiter.
Ich brauche ja nur den Eintrag von Ghostscript.
Member: chkdsk
chkdsk Aug 11, 2021 at 13:31:57 (UTC)
Goto Top
Zitat von @DanielG1974:

Das Problem mit den Uninstall-Pfaden in der Registry ist, dass dort nicht alle Anwendungen hinter einem Eintrag stecken.
32-Bit und 64-Bit Anwendungen sind unter Umständen in verschiedenen Registry-Pfaden hinterlegt.


ich lese die installierte Software in meinen Skripten immer über
get-package | select name
und
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall  | Get-ItemProperty
aus. Erkennt zuverlässig 32 & 64 Bit
Member: DanielG1974
DanielG1974 Aug 11, 2021 at 14:41:08 (UTC)
Goto Top
Ich lasse den Beitrag hier noch offen und poste abschließend meinen Code.
Eventuell sucht ja noch jemand so ein Skript.
Danke auch an chkdsk.