none
Windows-Appx deinstallieren anhand von Schlagwörtern in einem Array RRS feed

  • Frage

  • Hallo zusammen 😊,

    ich möchte in PowerShell selbst ein Skript schreiben, was bestimmte Apps deinstalliert. In einem Array sind Schlagwörter enthalten und es sollen alle Apps deinstalliert werden, welche ein jeweiliges Keyword haben. Ich möchte das Ganze dann Keyword für Keyword in einer foreach-Schleife abarbeiten lassen.

    Wo es aktuell scheitert ist, dass wenn ich die Schleife ausführe, zwar alle angegebenen Apps deinstalliert werden, jedoch möchte ich eine Statusausgabe mit einbauen.

    Nehmen wir mal an das Array ist so aufgebaut: 

    $appx_keywords = @(
        "Microsoft.3DBuilder",
        "Microsoft.BingWeather",
        "Microsoft.GetHelp"
    )

    Wenn App *Microsoft.3DBuilder* deinstalliert wurde dann springe zum nächsten Schlüsselwort.

    Wenn die App noch nicht deinstalliert wurde, warte 5 Sekunden und prüfe, ob die App noch installiert ist. Die Prüfung kann ich mit einer while-Schleife realisieren.

    Folgendes Problem habe ich:

    1. Wenn ich via Get-AppxPackage -AllUsers *$appxkey* | Remove-AppxPackage die Software deinstalliere, springt er sofort zum nächsten Schlagwort wenn ich die while-Schleife nicht einbaue.
    2. Wenn ich die While einbaue dann bleibt es in einer Dauerschleife hängen.

     

    Ich brauche einen Bezugswert, den ich verwenden kann, ob die App schon deinstalliert wurde oder nicht.

    Wenn ich sogar nach der Deinstallation Get-AppXPackage -Name *$appxkey* -AllUsers ausführe, wird mir immer noch ein Eintrag der vorher deinstallierten App angezeigt. Vielleicht ist Ziel das Paket ganz zu löschen?

     

    Ich habe dann versucht, dies mit einem Job zu realisieren in folgender Form. Problem ist nur, mit der nachfolgenden Variante deinstalliert er mir gleich alle Apps auf einmal.

    Also folgendes funktioniert nicht:

    Start-Job
    -Name Deinstallprocess -ScriptBlock { Get-AppxProvisionedPackage -online | where {$_.PackageName -like "*$appxkey*"} | Remove-AppxProvisionedPackage -online }
    Wait-Job -Name Deinstallprocess


    Ich möchte, dass das Skript anhand von Schlagwörtern in einem Array eine App findet und deinstalliert. Erst wenn die App wirklich deinstalliert wurde, springe zum nachfolgenden Schlagwort.

    NACHTRAG:

    Ich habe nun das Paket gelöscht mit

    Remove-AppxPackage -Package <Hier der PackageFullName> -AllUsers

    Ich glaube so kann ich nun im nachhinein mit while testen, ob das Paket noch zu finden ist. Also den weg welche ich gehe ist das paket selbst erstmal zu deinstallieren und ann zu löschen. Ich bin für weitere Vorschläge offen.

    Ich würde mich sehr über Lösungsvorschläge freuen.

    Danke & viele Grüße 😊

     

     



    • Bearbeitet web-codex Sonntag, 4. Oktober 2020 19:25 Nachtrag
    Sonntag, 4. Oktober 2020 18:52

Antworten

  • Moin,

    Du machst Dir das Leben viel zu schwer :-) Du musst hier keine Warteschleifen einbauen, denn

    1. der Vorgang ist synchron. Wenn das Cmdlet fertig ist, ist das Package entfernt sofern das möglich war, und
    2. nicht alle Packages lassen sich entfernen.

    Bei Remove-AppXPackage musst Du auch den Schalter -AllUsers verwenden, wenn Du sie per Get-AppXPackage -AllUsers gefunden hast.

    Wenn Du den Erfolg des Entfernens bewerten möchtest, nutze -ErrorAction Stop und try/catch. Das hilft Dir aber nicht, irgendwas zu entfernen, was nicht entfernbar ist. Aber immerhin kannst Du das protokollieren.

    In meinem Skript, das ich produktiv einsetze, ziehe ich die installierten Packages jedoch am Anfang raus und vergleiche sie dann nacheinander mit den Array-Elementen, spart wertvolle CPU-Zyklen.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Sonntag, 4. Oktober 2020 20:00
  • Hallo zusammen :-),

    ich wollte nur mitteilen, dass ich nun erstmal das Problem lösen konnte.


    Verlauf:

    1. Es wird anhand einer foreach und Arrays geprüft, ob eine App mit dem jeweiligen Keyword gefunden wird. Wenn ja, dann führe Operation aus, wenn nicht dann springe zum nächsten Schlagwort und vermerke es im Protokoll.
    2. Wenn eine App gefunden wird, dann führe Deinstallation aus
    3. Nachfolgend lösche das Paket.
    4. Prüfe, ob das Paket auch wirklich gelöscht wurde.
    5. Es wird alles in einem Logfile protokolliert
    6. Bisher konnte er alle Pakete deinstallieren und löschen.

    Nun brauche ich noch das Szenario, wenn ein Paket nicht deinstalliert oder gelöscht werden konnte.

    Danke & viele Grüße :)

    Sonntag, 4. Oktober 2020 22:24

Alle Antworten

  • Statt while, mache einen ForEach oder For für deine Keywords.
    Sonntag, 4. Oktober 2020 19:51
  • Moin,

    Du machst Dir das Leben viel zu schwer :-) Du musst hier keine Warteschleifen einbauen, denn

    1. der Vorgang ist synchron. Wenn das Cmdlet fertig ist, ist das Package entfernt sofern das möglich war, und
    2. nicht alle Packages lassen sich entfernen.

    Bei Remove-AppXPackage musst Du auch den Schalter -AllUsers verwenden, wenn Du sie per Get-AppXPackage -AllUsers gefunden hast.

    Wenn Du den Erfolg des Entfernens bewerten möchtest, nutze -ErrorAction Stop und try/catch. Das hilft Dir aber nicht, irgendwas zu entfernen, was nicht entfernbar ist. Aber immerhin kannst Du das protokollieren.

    In meinem Skript, das ich produktiv einsetze, ziehe ich die installierten Packages jedoch am Anfang raus und vergleiche sie dann nacheinander mit den Array-Elementen, spart wertvolle CPU-Zyklen.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Sonntag, 4. Oktober 2020 20:00
  • Statt while, mache einen ForEach oder For für deine Keywords.

    @Der Suchende

    Hallo und danke für deine Antwort. :)

    Ich frage diese, wie im ersten Absatz geschrieben, die Keywords mit einer foreach ab.

    Viele Grüße


    • Bearbeitet web-codex Sonntag, 4. Oktober 2020 20:52 Ergänzung
    Sonntag, 4. Oktober 2020 20:34
  • @Evgenij Smirnov

    Danke für deine Infos :)

    Ich habe aktuell einen Teilerfolg, jedoch habe ich wirklich etwas zu kämpfen, weil gewisse Pakete sich nicht löschen lassen. Ich denke ich werde es einmal versuchen (for-Schleife) und dann springe ich zum nächsten Schlagwort und vermerke dies im Logfile.

    Mit -AllUsers habe ich gearbeitet.

    Was mich interessiert ist das -ErrorAction Stop und try/catch, was du geschrieben hast. Da suche ich aktuell noch nach Infos, wie man dies genau einsetzt.

    Am Anfang lasse ich via if-Bedingung prüfen, ob eine App mit dem Schlagwort überhaupt installiert ist. Wenn ja, führe die Deinstallation aus, wenn nicht, springe zum nächsten Schlagwort.

    Danke & viele Grüße

    Sonntag, 4. Oktober 2020 20:51
  • Hallo zusammen :-),

    ich wollte nur mitteilen, dass ich nun erstmal das Problem lösen konnte.


    Verlauf:

    1. Es wird anhand einer foreach und Arrays geprüft, ob eine App mit dem jeweiligen Keyword gefunden wird. Wenn ja, dann führe Operation aus, wenn nicht dann springe zum nächsten Schlagwort und vermerke es im Protokoll.
    2. Wenn eine App gefunden wird, dann führe Deinstallation aus
    3. Nachfolgend lösche das Paket.
    4. Prüfe, ob das Paket auch wirklich gelöscht wurde.
    5. Es wird alles in einem Logfile protokolliert
    6. Bisher konnte er alle Pakete deinstallieren und löschen.

    Nun brauche ich noch das Szenario, wenn ein Paket nicht deinstalliert oder gelöscht werden konnte.

    Danke & viele Grüße :)

    Sonntag, 4. Oktober 2020 22:24