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):
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 93816240321
Url: https://administrator.de/contentid/93816240321
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
2 Kommentare
Neuester Kommentar
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
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...
Gruß
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
}
$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
}