beidermachtvongreyscull
Goto Top

Bulk Patching mit Powershell und msiexec. Wo liegt der Fehler im Script?

Moin Kollegen,

spart Euch bitte Sprüche wie "Mach's mit WSUS" im voraus. Ich habe gute Gründe, auf Windows Update zu verzichten.

Also so sieht es aus:

Ich habe 3 Windows 2016 Terminalserver in einer Farm laufen. Auf allen ist Office 2016 x86 installiert.

Nun wollte ich Office 2016 offline aktualisieren.

Dazu habe ich mittels WSUSOffline alle Updatepakete heruntergeladen und entpackt, so dass mir msp-Dateien vorliegen.

Um die Sache nun in einem Rutsch durchzuführen, habe ich folgendes Script gebaut:

$files = Get-ChildItem | Where {$_.Extension -eq ".msp"}  
foreach ($file in $files)
{
   $file.FullName
   Start-Process c:\windows\system32\msiexec.exe -Wait -ArgumentList "/p '$file.FullName' REINSTALL=ALL REINSTALLMODE=omus /qn /l*v 'c:\OFU\log.txt'"  
}

Das Script wird im gleichen Ordner ausgeführt, in dem auch die MSP-Pakete liegen.

Mit Parameter /qn läuft das Script durch und es passiert nichts. Ohne den Parameter, hagelt es Fehlermeldungen wie "Dieses Patchpaket konnte nicht geöffnet werden".
Wenn das nur bei den unpassenden Paketen passieren würde, würde ich es noch verstehen, aber die Meldung kommt bei allen.

Ich lasse extra zum Nachvollziehen die Variable nochmals davor ausgeben. Die Ausgabe ist ok. Voller Pfad, voller Dateiname, keine Leerzeichen.

Auch mit erhöhten Rechten keine Änderung.

Ich blicke nicht durch, was da falsch läuft, denn manuell auf der Console funktioniert der Aufruf.

Ich würde mich freuen, wenn jemand von Euch mir hier eine Hilfestellung geben kann.

Danke im voraus.

bdmvg

Content-Key: 502677

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

Printed on: April 19, 2024 at 15:04 o'clock

Member: erikro
Solution erikro Oct 09, 2019 at 09:49:51 (UTC)
Goto Top
Moin,

Zitat von @beidermachtvongreyscull:
> $files = Get-ChildItem | Where {$_.Extension -eq ".msp"}  

Hier besser:

$files = get-childitem -path *.msp

foreach ($file in $files)
> {
>    $file.FullName
>    Start-Process c:\windows\system32\msiexec.exe -Wait -ArgumentList "/p '$file.FullName' REINSTALL=ALL REINSTALLMODE=omus /qn /l*v 'c:\OFU\log.txt'"  
> }
> 

Hier mal ein Beispiel, damit Du verstehst, warum:

PS P:\> $files = get-childitem *.pdf
PS P:\> foreach($file in $files) {'$file.fullname'}  
$file.fullname
$file.fullname
$file.fullname
$file.fullname
$file.fullname
$file.fullname

Wenn Du eine Variable in Hochkommata einschließt, dann wird sie nicht aufgelöst, sondern der Variablenname als Eingabe angenommen.

Jetzt mit Anführungszeichen.
PS P:\> foreach($file in $files) {"$file.fullname"}  
P:\dateiname.pdf.fullname
(...)

Wie Du siehst, gibt es so den Dateinamen und .fullname wird angehängt. Auch nicht das, was Du willst.

Jetzt ohne .fullname
PS P:\> foreach($file in $files) {"$file"}  
P:\dateiname.pdf

oder

PS P:\test> $files = get-childitem *.csv
PS P:\test> foreach($file in $files) {"$($file.fullname)"}  
P:\test\dateiname.csv
(...)

oder

PS P:\test> foreach($file in $files) {"$file"}  
P:\test\dateiname.csv
(...)

Das ist richtig.

hth

Erik
Mitglied: 141320
Solution 141320 Oct 09, 2019 updated at 10:43:41 (UTC)
Goto Top
Und mit single Quotes um die Pfade kann die CMD (in der msiexec ja ausgeführt wird) auch nicht gerade gut umgehen...

Get-ChildItem *.msp -File | %{
   start msiexec.exe -Wait -ArgumentList "/p `"$($_.FullName)`" REINSTALL=ALL REINSTALLMODE=omus /qn /l*v `"c:\OFU\log.txt`""  
}
Member: beidermachtvongreyscull
beidermachtvongreyscull Oct 09, 2019 at 11:30:16 (UTC)
Goto Top
Hab vielen Dank für die Hilfe.

Ich habe das Script nun so umgebaut:

$files = Get-ChildItem | Where {$_.Extension -eq ".msp"}  
foreach ($file in $files)
{
   
    $datei = $file.FullName
    $arglist = "/p  $($datei)  REINSTALL=ALL REINSTALLMODE=omus /qn"  
    Start-Process c:\windows\system32\msiexec.exe -Wait -ArgumentList $arglist
}

Funktioniert jetzt wie gewünscht.
Member: beidermachtvongreyscull
beidermachtvongreyscull Oct 09, 2019 at 11:31:03 (UTC)
Goto Top
Auch Dir vielen Dank für die Hilfe.