none
auf array Spalten mit Member Bezeichner zugreifen? RRS feed

  • Frage

  • Hallo!

    Möchte auf Arrray Inhalte mit der Member-Bezeichnung zugreifen.
    Geht das?

    Habe ein Array generiert: 

    $my = Get-WmiObject -Class Win32_Product -ComputerName .  |  Select-Object Name, Version, InstallDatei, IdentifyingNumber  | Sort-Object -Descending -Property InstallDate

    dann um eine Spalte erweitert:

    $my | Add-Member -NotePropertyName Uninstall

    Nun möchte ich die Werte in der Spalte Uninstall abändern
    das hat nicht funktioniert:
    $my | foreach {
    $_.Uninstall = Get-ChildItem -Path "HKCU:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"+$_.IdentifyingNumber" -Name UninstallString
    }

    Danke für eure Tipps

    Erhy

    Mittwoch, 14. Juni 2017 13:37

Antworten

  • Hallo,

    ich kann in deinem Code keinen Fehler erkennen. Woran siehst du denn, dass es nicht funktioniert haben soll? Gibt es einen Fehler oder ist das Feld leer? Kannst du testweise etwas einfacheres in das Feld schreiben, z.B. ein "a"? 

    Ich sehe da mehrere Fehler.

    Erstens, sind die Installer im HKLM und nicht im HKCU.

    Zweitens, gibt es 32-Bit und 64-Bit Keys.

    Dann ist das Anführungszeichen nach IdentifyingNumber zu viel

    Dann funktioniert Add-Member nicht ohne Value

    Hier ist Quick und Dirty:

    $my = Get-WmiObject -Class Win32_Product -ComputerName .  |  Select-Object Name, Version, InstallDatei, IdentifyingNumber  | Sort-Object -Descending -Property InstallDate
    
    $my | foreach {
         $path = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$($_.IdentifyingNumber)"
         if (Get-Item $path -EA SilentlyContinue) {
            "32-Bit: $($_.IdentifyingNumber)"
         } else {
            $path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$($_.IdentifyingNumber)"
            if (Get-Item $path -EA SilentlyContinue) {
                "64-Bit: $($_.IdentifyingNumber)"
            } else {
                "No Reg: $($_.IdentifyingNumber)"
                $path = ""
            }
         }
         $val = ""
         if ($path) {
            $uis = Get-ItemProperty $path -Name UninstallString -EA SilentlyContinue
            if ($uis) {
                $val = $uis.UninstallString
            } 
         } 
         $_ | Add-Member -MemberType NoteProperty -Name Uninstall -Value $val
     }
    
     $my | ft -AutoSize


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    • Als Antwort markiert Erhy Mittwoch, 14. Juni 2017 21:21
    Mittwoch, 14. Juni 2017 14:51

Alle Antworten

  • Hallo,

    ich kann in deinem Code keinen Fehler erkennen. Woran siehst du denn, dass es nicht funktioniert haben soll? Gibt es einen Fehler oder ist das Feld leer? Kannst du testweise etwas einfacheres in das Feld schreiben, z.B. ein "a"? 

    Mittwoch, 14. Juni 2017 14:08
  • zumindest in der PowerShell

    bricht das my  foreach { ..

    nicht ab, wenn ich } eingebe.

    Erhy

    Mittwoch, 14. Juni 2017 14:41
  • Hallo,

    ich kann in deinem Code keinen Fehler erkennen. Woran siehst du denn, dass es nicht funktioniert haben soll? Gibt es einen Fehler oder ist das Feld leer? Kannst du testweise etwas einfacheres in das Feld schreiben, z.B. ein "a"? 

    Ich sehe da mehrere Fehler.

    Erstens, sind die Installer im HKLM und nicht im HKCU.

    Zweitens, gibt es 32-Bit und 64-Bit Keys.

    Dann ist das Anführungszeichen nach IdentifyingNumber zu viel

    Dann funktioniert Add-Member nicht ohne Value

    Hier ist Quick und Dirty:

    $my = Get-WmiObject -Class Win32_Product -ComputerName .  |  Select-Object Name, Version, InstallDatei, IdentifyingNumber  | Sort-Object -Descending -Property InstallDate
    
    $my | foreach {
         $path = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$($_.IdentifyingNumber)"
         if (Get-Item $path -EA SilentlyContinue) {
            "32-Bit: $($_.IdentifyingNumber)"
         } else {
            $path = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$($_.IdentifyingNumber)"
            if (Get-Item $path -EA SilentlyContinue) {
                "64-Bit: $($_.IdentifyingNumber)"
            } else {
                "No Reg: $($_.IdentifyingNumber)"
                $path = ""
            }
         }
         $val = ""
         if ($path) {
            $uis = Get-ItemProperty $path -Name UninstallString -EA SilentlyContinue
            if ($uis) {
                $val = $uis.UninstallString
            } 
         } 
         $_ | Add-Member -MemberType NoteProperty -Name Uninstall -Value $val
     }
    
     $my | ft -AutoSize


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    • Als Antwort markiert Erhy Mittwoch, 14. Juni 2017 21:21
    Mittwoch, 14. Juni 2017 14:51
  • Nur mal aus Neugier und unabhängig von Deinem Script: Was willst Du denn eigentlich erreichen?

    .. und noch ein Tipp: wenn Du Dein "Ergebnis-Object" um ein Property erweitern möchtest und sowieso schon ein Select-Object benutzt, kannst Du Dir das Leben vereinfachen, wenn Du einfach die gewünschte "Property" ans Select-Object anhängst ... so wie hier: 

    Get-WmiObject -Class Win32_Product | Select-Object Name, Version, InstallDatei, IdentifyingNumber, UnInstall
    ... den Rest erledigt die Powershell für Dich. Liest sich auch einfacher.  ;-)

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 14. Juni 2017 17:48
  • Danke für eure Mühe!

    Mein Fehler war vor allem, das fehlende schließende " .

    Der letzte Vorschlag, das Uninstall einfach anzuhängen funktioniert nicht, da Uninstall in

    Get-WmiObject -Class Win32_Product -ComputerName .  | Get-Member

    nicht gelistet ist.

    Ich zaudre überhaupt mit dem Get-WmiObject -Class Win32_Product , da ich entdeckt habe, dass nicht alle Programme gelistet werden.
    Weiß wer eine Begründung?

    Wenn man die Uninstall zweige in der Registry durchforstet, werden weitere Programme gelistet.

    Danke für die Diskussion

    Erhy

    Mittwoch, 14. Juni 2017 21:31
  • Der letzte Vorschlag, das Uninstall einfach anzuhängen funktioniert nicht, da Uninstall in

    Get-WmiObject -Class Win32_Product -ComputerName .  | Get-Member

    nicht gelistet ist.


    Hast Du es probiert? Bitte probier es einmal. Ich vermute, das meine Powershell nicht sooo viel anders ist als andere.  ;-)
    Ich zaudre überhaupt mit dem Get-WmiObject -Class Win32_Product , da ich entdeckt habe, dass nicht alle Programme gelistet werden.

    Deshalb meine Frage, was Du eigentlich erreichen möchtest. Unter Windows gibt es so viele unterschiedliche Wege Anwendungen zu installieren, dass es schwer ist, mit einem "Rundumschlag" wirklich alle zu erwischen. Nach meiner Erfahrung stellt sich meistens auch die Frage, ob das wirklich nötig ist.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 14. Juni 2017 22:09
  • Der letzte Vorschlag, das Uninstall einfach anzuhängen funktioniert nicht, da Uninstall in

    Get-WmiObject -Class Win32_Product -ComputerName .  | Get-Member

    nicht gelistet ist.

    Hast Du es probiert? Bitte probier es einmal. Ich vermute, das meine Powershell nicht sooo viel anders ist als andere.  ;-)

    Habe es probiert. Bringt zwar keine Fehlermeldung aber in der Spalte Uninstall  steht nichts.

    Ich zaudre überhaupt mit dem Get-WmiObject -Class Win32_Product , da ich entdeckt habe, dass nicht alle Programme gelistet werden.


    Deshalb meine Frage, was Du eigentlich erreichen möchtest. Unter Windows gibt es so viele unterschiedliche Wege Anwendungen zu installieren, dass es schwer ist, mit einem "Rundumschlag" wirklich alle zu erwischen. Nach meiner Erfahrung stellt sich meistens auch die Frage, ob das wirklich nötig ist.

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Ich installiere gerade Visual Studio 2017 Community und bei leidvollen Erfahrungen habe ich erlebt, dass es sich VS kaum Deinstallieren lässt, darum möchte ich die vielen Zwischenschritte bei der Installation erfassen.

    Erhy

    Donnerstag, 15. Juni 2017 10:07
  • Habe es probiert. Bringt zwar keine Fehlermeldung aber in der Spalte Uninstall steht nichts.


    Ja natürlich steht da noch nichts drin. Ich meinte auch nur, dass Du Dir das Gedöns mit dem Add-Member sparen kannst. Mit den richtigen Werten füllen musst das dann schon selber. ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 15. Juni 2017 10:36
  • Ich installiere gerade Visual Studio 2017 Community und bei leidvollen Erfahrungen habe ich erlebt, dass es sich VS kaum Deinstallieren lässt, darum möchte ich die vielen Zwischenschritte bei der Installation erfassen.

    Lohnt sich dieser Aufwand wirklich? Um wieviele Maschinen geht es denn? Für Powershell genügt vielleicht auch Visual Studio Code - viel kleiner und agiler ....

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 15. Juni 2017 10:45
  • Ich zaudre überhaupt mit dem Get-WmiObject -Class Win32_Product , da ich entdeckt habe, dass nicht alle Programme gelistet werden.
    Weiß wer eine Begründung*?*

    Win32_Product erfasst nur MSI-Pakete, keine setup.exe.

    Freitag, 16. Juni 2017 09:32
  • ... hab noch was gefunden, was Dir vielleicht weiterhelfen könnte:

    http://windowsitpro.com/scripting/auditing-32-bit-and-64-bit-applications-powershell


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. Juni 2017 09:47
  • ... hab noch was gefunden, was Dir vielleicht weiterhelfen könnte:

    http://windowsitpro.com/scripting/auditing-32-bit-and-64-bit-applications-powershell



    ...und die Wahrheit steckt, wie so oft, im Kommentar eher als im Post an sich ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Freitag, 16. Juni 2017 09:58
  • ...und die Wahrheit steckt, wie so oft, im Kommentar eher als im Post an sich ;-)

    ... tja, da schlägt das Thema mit den vielen Köchen wieder zu. Selbst Microsoft hält sich gelegentlich nicht an die eigenen Vorgaben. ;-)

    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 16. Juni 2017 11:30
  • ... hab noch was gefunden, was Dir vielleicht weiterhelfen könnte:

    http://windowsitpro.com/scripting/auditing-32-bit-and-64-bit-applications-powershell


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''


    Danke
    Erhy
    Freitag, 16. Juni 2017 13:05
  • und das ist meine Version,
    mit dem Versuch auch die Zeiteinträge zu restaurieren.

    Installed_programsV2.ps1

    Samstag, 17. Juni 2017 13:48