redrumdex
Goto Top

PowerShell Skript mehrere Installationen über txt Liste

Hallo,

ich habe schon im Internet gesucht, aber was ich falsch mache habe ich leider nicht gefunden.

Ich möchte auf einem Gerät über ein Skript mehrere Treiber installieren, die alle in einem Ordner liegen.
Dabei soll das Skript alle Dateien aus dem Ordner auslesen und eine Datei ausgeben. Da einige Treiber einen Neustart benötigen, soll nach der Installation der entsprechende Eintrag aus der Datei gelöscht werden, so das bei erneutem Start das Skript bei nächsten Treiber weiter macht und nicht alle von vorne installiert.

Nun zu meinem Problem:
Dateien auslesen aus dem Ordner und direkt in eine Variable für die foreach Schleife zum Installieren funktioniert ohne Probleme.
Aber Dateien auslesen in eine Datei und dann die Datei auslesen in eine Variable für die foreach Schleife funktioniert nicht so richtig.
Wenn ich den Inhalt der Variable $installers (direkt ausgelesen aus Ordner) vergleiche mit der Variable $installers (ausgelesen aus der Datei) sieht sie für mich komplett gleich aus. Auch das Löschen der Überschriften und co. bringt leider nichts, was mich auch verwundert.

Das Skript (Das Auskommentierte funktioniert, nur ohne halt nicht):
$pfad = "C:\Treiber"  
$file = "C:\Treiber\Install.txt"  

Get-ChildItem $pfad -Filter "*.exe" | Out-File $file  

$installers = Get-Content $file

#$installers = Get-ChildItem $pfad -Filter "*.exe" 

foreach($inst in $installers)
{
Start-Process -Wait -FilePath ($inst.Fullname) -ArgumentList '/silent', '/v', '/qn' -PassThru  
(Get-Content $file) -ne (Get-Content $file)[7] | Set-Content $file
}

Fehlermeldung:
Start-Process : Das Argument für den Parameter "FilePath" kann nicht überprüft werden. Das Argument ist NULL oder leer.
Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie den Befehl erneut aus.
In Zeile:12 Zeichen:31
+ Start-Process -Wait -FilePath ($inst.Fullname) -ArgumentList '/silent ...
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: ( : ) [Start-Process], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.StartProcessCommand


Inhalt der txt:


Verzeichnis: C:\Treiber


Mode LastWriteTime Length Name
------------- ------ ----
-a---- 27.04.2024 00:20 33132768 camera.exe
-a---- 27.04.2024 00:21 966656 camera patch.exe
-a---- 26.04.2024 23:29 33226752 bluetooth.exe
-a---- 26.04.2024 23:22 1636504 audio.exe
-a---- 27.04.2024 00:24 7177664 fingerprint.exe

Ich hätte erwartet, dass er generell bei Zeile 1 anfängt und immer in Fehler läuft, da sie ja leer ist. Daher habe ich die ersten 7 Zeilen gelöscht mit: (Get-Content $file | Select-Object -Skip 7 ) | Set-Content $file
Aber dies bringt leider den gleichen Fehler. Warum klappt es aber, wenn ich den Ordner direkt in die Variable einlesen lasse bzw. wie bekomme ich es aus der Datei zum Laufen?
Danke schon einmal für die Hilfe.

LG Dex

Content-Key: 93816240321

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

Printed on: May 20, 2024 at 13:05 o'clock

Member: hempel
Solution hempel May 15, 2024 updated at 05:02:48 (UTC)
Goto Top
Moin.
Der Inhalt einer Textdatei hat keine Eigenschaft "FullName". Eine eingelesene Textdatei besteht als erstes mal nur aus einem Array aus Strings für jede Zeile ein Element.
Wenn dir die vollen Pfade der Dateien ausreichen dann erreichst du das so
$pfad = "C:\Treiber"  
$file = "C:\Treiber\Install.txt"  
(Get-ChildItem $pfad -File -Filter *.exe).FullName | Out-File $file
$installers = Get-Content $file

foreach($inst in $installers){
   Start-Process -Wait -FilePath $inst -ArgumentList '/silent', '/v', '/qn' -PassThru  
}
Möchtest du stattdessen mehrere Eigenschaften von Dateien aus einer Textdatei (falls du davon im Verlauf der Schleife noch andere brauchst) laden, dann benutze bspw. eine CSV-Datei und die entsprechenden CMDLets Export-CSV und Import-CSV, dann klappt das mit der Eigenschaft "FullName" wieder...
$pfad = "C:\Treiber"  
$file = "C:\Treiber\Install.csv"  
# Export in CSV-Datei
Get-ChildItem $pfad -File -Filter *.exe | select FullName,LastWriteTime,Length | export-csv -Path $file -Delimiter ";" -NoTypeInformation -Encoding UTF8  
# Einlesen aus CSV in Objekt-Array
$installers = Import-CSV -Path $file -Delimiter ";" -Encoding UTF8  

foreach($inst in $installers){
   Start-Process -Wait -FilePath $inst.Fullname -ArgumentList '/silent', '/v', '/qn' -PassThru  
}
Gruß
Member: RedRuMDex
RedRuMDex May 15, 2024 at 22:56:05 (UTC)
Goto Top
Danke für die schnelle Hilfe. Hat geklappt face-smile