markus2016
Goto Top

Appx aus Image auslesen und entfernen

Hallo zusammen,

ich kommen gerade nicht weiter.

Aus dem bereitgestellten Windows-Image lese ich die AppxProvisionedPackages aus und speichere diese in eine Textdatei.

Get-AppxProvisionedPackage -Path "$Global:Projekt\Image_mount" | Select PackageName | Out-File "$Global:Projekt\Windows_AppxPackage_$(get-date -f yyyy.MM.dd).txt"  

Anschließend möchte ich die Datei auslesen und die AppxProvisionedPackages aus dem Windows-Image entfernen.
Die Bearbeitung der Datei möchte ich später mittels RadioButtons realisieren.
Aber erstmal sollte der Standard funktionieren.
Und genau da liegt das Problem.

$Appx = Get-Content "$Global:Projekt\Windows_AppxPackage*.txt"  
$i=3
Do{
$Appx | ForEach {$Appx[$i]; $env:DISM\dism /Image:"$Global:Projekt\Image_mount" /Remove-ProvisionedAppxPackage /PackageName:$Appx[$i]; $i++}  
}
while ($i -le $Appx.Lenght)

In der Konsole bekomme ich folgende Meldung:
Microsoft.3DBuilder_11.0.47.0_neutral_~_8wekyb3d8bbwe

Tool zur Imageverwaltung für die Bereitstellung
Version: 10.0.14393.0

Abbildversion: 10.0.14393.0


Fehler: 87

Falscher Parameter.

Die DISM-Protokolldatei befindet sich unter "C:\WINDOWS\Logs\DISM\dism.log".  

Da aus $Appx[$i] die Objekte korrekt ausgegeben werden (z.B. Microsoft.3DBuilder_11.0.47.0_neutral_~_8wekyb3d8bbwe) verstehe ich das nicht ganz.
Wenn ich z.B. Microsoft.3DBuilder_11.0.47.0_neutral_~_8wekyb3d8bbwe direkt eingebe, wird der Vorgang erfolgreich abgeschlossen.

In der dism.log steht folgendes was ich auch nicht verstehe.

2016-11-26 20:03:15, Error                 DISM   DISM Appx Provider: PID=4052 TID=9572 Failed when trying to convert package fullname ' PackageName                                                                   -----------                                                                   Microsoft.3DBuilder_11.0.47.0_neutral_~_8wekyb3d8bbwe Microsoft.BingWeather_4.9.51.0_neutral_~_8wekyb3d8bbwe Microsoft.DesktopAppInstaller_1.5.26001.0_neutral_~_8wekyb3d8bbwe             Microsoft.Getstarted_3.11.3.0_neutral_~_8wekyb3d8bbwe                         Microsoft.Messaging_2.7.1001.0_neutral_~_8wekyb3d8bbwe                        Microsoft.MicrosoftOfficeHub_2015.6801.23751.0_neutral_~_8wekyb3d8bbwe        Microsoft.MicrosoftSolitaireCollection_3.9.5100.0_neutral_~_8wekyb3d8bbwe     Microsoft.MicrosoftStickyNotes_1.0.136.0_neutral_~_8wekyb3d8bbwe              Microsoft.Office.OneNote_2015.6868.57981.0_neutral_~_8wekyb3d8bbwe            Microsoft.OneConnect_1.1605.17.0_neutral_~_8wekyb3d8bbwe                      Microsoft.People_2016.709.155.0_neutral_~_8wekyb3d8bbwe                       Microsoft.SkypeApp_11.4.86.0_neutral_~_kzf8qxf38zg5c                          Microsoft.StorePurchaseApp_1.0.454.0_neutral_~_8wekyb3d8bbwe                  Microsoft.Windows.Photos_2016.511.9510.0_neutral_~_8wekyb3d8bbwe              Microsoft.WindowsAlarms_2016.622.2118.0_neutral_~_8wekyb3d8bbwe               Microsoft.WindowsCalculator_2016.606.1706.0_neutral_~_8wekyb3d8bbwe           Microsoft.WindowsCamera_2016.404.190.0_neutral_~_8wekyb3d8bbwe                microsoft.windowscommunicationsapps_2015.6868.41201.0_neutral_~_8wekyb3d8bbwe Microsoft.WindowsFeedbackHub_1.3.1741.0_neutral_~_8wekyb3d8bbwe               Microsoft.WindowsMaps_2016.701.2235.0_neutral_~_8wekyb3d8bbwe                 Microsoft.WindowsSoundRecorder_2016.611.2.0_neutral_~_8wekyb3d8bbwe           Microsoft.WindowsStore_11606.1001.394.0_neutral_~_8wekyb3d8bbwe               Microsoft.XboxApp_2016.623.248.0_neutral_~_8wekyb3d8bbwe                      Microsoft.XboxIdentityProvider_2016.616.818.0_neutral_~_8wekyb3d8bbwe         Microsoft.ZuneMusic_2019.6.19261.0_neutral_~_8wekyb3d8bbwe                    Microsoft.ZuneVideo_2019.6.19281.0_neutral_~_8wekyb3d8bbwe[31]' to PackageId - CDismContext::IsPackageFullNameBundle(hr:0x80070057)  

Warum wird den nicht die einzelne Zeile aus $Appx[$i] aufgerufen wie in der Konsole? Und wie kann ich das mit den Leerzeichen in der von mir erzeugten Textdatei und verhindern?

Vielen Dank für Eure Unterstützung.

Schöne Grüße

Markus2016

Content-ID: 322170

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

Ausgedruckt am: 27.11.2024 um 13:11 Uhr

77559
77559 26.11.2016 um 22:19:32 Uhr
Goto Top
Hallo Markus,
du schmeisst da ForEach und For durcheinander.
ForEach ist doch ein enumerator für alles was $Appx in die Pipe ausgibt, den Inhalt sprichst du mit $_ und ggfs angehängtem Property an.
$Appx | ForEach {$_}
bei For kannst du entweder:
For ($App in $Appx) { $App }
oder
For ($i = 0; $i -le $Appx.Length; $i++) {$Appx[$i]}
benutzen
Markus2016
Markus2016 26.11.2016 um 22:46:10 Uhr
Goto Top
Hallo LotPings,

stimmt das habe ich nicht berücksichtigt. Danke

Aber das Ergebnis ändert sich auch mit For nicht. face-sad

$Appx = Get-Content "$Global:Projekt\Windows_AppxPackage*.txt"  
Do{
For ($i = 3; $i++) {$Appx[$i]; .$env:DISM\dism /Image:"$Global:Projekt\Image_mount" /Remove-ProvisionedAppxPackage /PackageName:$Appx[$i]}  
}
while ($i -le $Appx.Lenght)

Die Konsole und die dism.log gibt mir noch die gleiche Meldung aus.

Hast noch einen Tipp?

Schöne Grüße

Markus2016
77559
77559 27.11.2016 um 00:21:37 Uhr
Goto Top
Markus,
irgendwie hast du scheinbar eine Neigung die Befehle zu mixen do..while und die for Schleife passen so nicht..

Vielleicht klappt das (und es ist Length nicht Lenght) :

$Appx = Get-Content "$Global:Projekt\Windows_AppxPackage*.txt"  
For ($i = 3;$i -le $Appx.Length; $i++) {
  .$env:DISM\dism /Image:"$Global:Projekt\Image_mount" /Remove-ProvisionedAppxPackage /PackageName:$Appx[$i]}  
}

Was sagt dir denn :
$Appx | get-Member
vielleicht liegt der fehler ja woanders.
131381
Lösung 131381 27.11.2016 aktualisiert um 09:05:18 Uhr
Goto Top
Der Fehler hier ist das er die Parameter nicht in Anführungszeichen kapselt, deswegen führt dann der Bindestrich in ..../Remove-ProvisionedAppxPackage...... zu der genannten Fehlermeldung, da die Powershell den Bindestrich als Einleitung eines CMDLet Parameter interpretiert!
Um das zu umgehen sollte man Parameter beim Aufruf von DOS-Befehlen immer in Anführungszeichen kapseln.


btw. wieso nutzt du DISM dafür? Die Powershell kennt doch ein natives CMDlet dafür namens
Remove-AppxProvisionedPackage

Außerdem würde ich den Export eher so machen
Get-AppxProvisionedPackage -Path "$Global:Projekt\Image_mount" | Select -Expand PackageName | Out-File "$Global:Projekt\Windows_AppxPackage_$(get-date -f yyyy.MM.dd).txt"  
und dann so in Schleife einlesen
(gc "$Global:Projekt\Windows_AppxPackage_*.txt") | %{  
   Remove-AppxProvisionedPackage -Path "$Global:Project\Image_mount" -Packagename $_  
}


Gruß
Markus2016
Markus2016 27.11.2016 um 22:02:30 Uhr
Goto Top
Hallo mikrotik,

danke für die Unterstützung.
Bei Remove-AppxProvisionedPackage hatte ich den Parameter -Path übersehen, deswegen hatte ich es mit dism versucht.

Habe es nach Deinem Beispiel umgesetzt.
Danke für den Tipp mit -Expand.

Get-AppxProvisionedPackage -Path "$Global:Projekt\Image_mount" | Select -Expand PackageName | Out-File "$Global:Projekt\Windows_AppxProvisionedPackage_$(get-date -f yyyy.MM.dd).txt"  

(Get-Content "C:\Users\Markus Gebhard\Desktop\Windows_AppxProvisionedPackage_*.txt") | ForEach-Object {   
Remove-AppxProvisionedPackage -Path "$Global:Projekt\Image_mount" -PackageName $_ }  

Die Konsole gibt mir folgenden Fehler aus:

Remove-AppxProvisionedPackage : Das Paket wurde nicht gefunden.
In C:\Windows_Home\Windows-Image erstellen\Windows-Image erstellen.ps1:1327 Zeichen:1
+ Remove-AppxProvisionedPackage -Path "$Global:Projekt\Image_mount" -Pa ...  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Remove-AppxProvisionedPackage], COMException
    + FullyQualifiedErrorId : Microsoft.Dism.Commands.RemoveAppxProvisionedPackageCommand

Hast Du vielleicht noch einen Tipp?

Schöne Grüße

Markus
131381
131381 28.11.2016 um 08:51:02 Uhr
Goto Top
Remove-AppxProvisionedPackage : Das Paket wurde nicht gefunden. 
Naja, sagt die Fehlermeldung ja schon, dann hast du das Paket schon aus dem Image entfernt und es ist nicht mehr zu finden face-wink

Btw. ist das Quell-Image und Ziel-Image das gleiche? Wenn ja, wieso gehst du den Umweg über eine Textdatei?? Du kannst das Ergebnis von Get-AppxProvisionedpackage direkt an Remove-AppxProvisionedPackage pipen!
Markus2016
Markus2016 28.11.2016 um 18:19:47 Uhr
Goto Top
Hallo mikrotik,

soweit war mir das klar. face-smile

Das bereitgestellte Image war beim letzten Versuch komplett jungfreulich.

Abfolge: Mount-WindowsImage -> Get-AppxProvisionedPackage -> Remove-AppxProvisionedPackage

Wo sollten denn die kleinen Appx nach dem Get-AppxProvisionedPackage hin verschwunden sein ? face-smile

Ich möchte mir später mittels RadioButtons eine Auswahlmöglichkeit erstellen, bei der die zu entfernenden Appx ausgewählt werden können.
Deshalb der Umweg mit der Textdatei.

An was könnte es noch liegen, dass die Pakete nicht gefunden werden, obwohl diese noch im Image vorhanden sind?

Schöne Grüße

Markus2016
131381
131381 28.11.2016 aktualisiert um 18:33:47 Uhr
Goto Top
Zitat von @Markus2016:
Ich möchte mir später mittels RadioButtons eine Auswahlmöglichkeit erstellen, bei der die zu entfernenden Appx ausgewählt werden können.
Deshalb der Umweg mit der Textdatei.
?? Das brauchst du auch dann nicht. Du kannst die Pakete in einer Variablen speichern und dann nachher per where-object die gecheckten ausfiltern.
An was könnte es noch liegen, dass die Pakete nicht gefunden werden, obwohl diese noch im Image vorhanden sind?
Keine Ahnung, geht hier problemlos. Vielleicht hast du noch alte Textdateien da liegen die mit eingelesen werden, du hast da ja ein Wildcard mit drin.
Lass dir die Namen aus der Textdatei ausgeben und vergleiche penibel ob sich bei dir da was an Zeichen reingeschummelt hat.
Markus2016
Markus2016 28.11.2016 um 21:18:58 Uhr
Goto Top
Hallo mikrotik,

jetzt hat es funktioniert.
Anscheinend hat sich irgendetwas an der Wildcard im Pfad aufgehängt.

Vielen Dank für deine Geduld und die Unterstützung.

Schöne Grüße

Markus2016