none
Probleme mit Where Klausel RRS feed

  • Frage

  • moin,

    ich komme irgendwie mit eine Where leider nicht weiter

    In MS-Access oder SQL sind solche Bedingen relativ einfach.

    where {$_.Anwendungen -notlike "CORONA" -and $_.PcName -like "PC*"

    bringt das als Ergebnis

    ich habe es auch schon mit notmatch probiert. Auch hier kommen leider auch Datensätze mit Corona.  Das CmdLet wurde von einem Kollegen mittels C# erstellt und greift auf eine Oracle DB zu. Kann es sein, dass das Feld/Property  Anwendungen kein String ist und daher die Where Klausel nicht richtig funktioniert?

    InventarNr             : 4324374
    Kategorie              : PC-NETZ
    PcName                 : PC11
    EthernetAdr            : 5065F34E8
    IpAdresse              : 10.1.1.2
    Bemerkung              : Intel i219
    Vorname                : MaX
    Famname                : Mustermann
    BenutzerNr             : Mustermann

    Anwendungen            : {CORONA, INTRNET, AKT2000, OFFICE...}
    MacBytes               : {80, 101, 243, 38...}
    IpBytes                : {10, 160, 216, 238}


    Chris

    Donnerstag, 2. Juli 2020 11:33

Antworten

  • -Match bewertet einen "regulären Ausdruck". Dieser sucht nach diesem komplexen Ausdruck.
    -like ist ein simplifizierter -match, der Wildcards unterstützt, da aber auch am Anfang und Ende stehen können:-like "AAAA" vergleicht genau "AAAA".
    like "AAA*" bedeutet Anfang mit AAA und Ende beliebig.
    like "*AAA" Endet mit AAA
    like "*AAA*" enthält irgendwo AAA

    https://www.windowspro.de/script/vergleichsoperatoren-powershell-eq-lt-gt-contains-match

    • Als Antwort markiert -- Chris -- Freitag, 3. Juli 2020 06:14
    Donnerstag, 2. Juli 2020 16:10
  • Moin,

    dann sind die Einträge in der Property "Anwendungen" offenbar selbst noch Objekte, die jeweils die Property "Anwendung" haben.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Freitag, 3. Juli 2020 06:14
    Freitag, 3. Juli 2020 05:51
  • Da die Property "Anwendungen" offenbar ein Array ist, solltest Du einen entsprechend geeigneten Vergleichsoperator benutzen.

    Where-Object { $_.Anwendungen -notcontains "CORONA" -and $_.PcName -like "PC*"}
    Für solche Vergleiche müssen die verglichenen Strings aber perfect matchen. Du kannst also keine Wildcards verwenden.


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Donnerstag, 2. Juli 2020 13:36
    Donnerstag, 2. Juli 2020 13:32

Alle Antworten

  • mit einem IF -notlike oder -notmatch geht es auch nicht aber mit einem -match und else geht es?

    if($pc.Anwendungen -match "CORONA"){
    }    
    else{
         write-host "treffer" $pc.PcName -ForegroundColor Green
         $pc.pcname >> c:\temp\pc4.txt
    }
    
    


    Chris


    • Bearbeitet -- Chris -- Donnerstag, 2. Juli 2020 11:47
    Donnerstag, 2. Juli 2020 11:46
  • Da die Property "Anwendungen" offenbar ein Array ist, solltest Du einen entsprechend geeigneten Vergleichsoperator benutzen.

    Where-Object { $_.Anwendungen -notcontains "CORONA" -and $_.PcName -like "PC*"}
    Für solche Vergleiche müssen die verglichenen Strings aber perfect matchen. Du kannst also keine Wildcards verwenden.


    Live long and prosper!

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

    • Als Antwort markiert -- Chris -- Donnerstag, 2. Juli 2020 13:36
    Donnerstag, 2. Juli 2020 13:32
  • da heißt ich darf auch PC* nicht verwenden.

    schade


    Chris

    Donnerstag, 2. Juli 2020 13:59
  • da heißt ich darf auch PC* nicht verwenden.

    Doch. Da verwendest Du ja -like als Vergleichsoperator.

    Live long and prosper!

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

    Donnerstag, 2. Juli 2020 15:25
  • -Match bewertet einen "regulären Ausdruck". Dieser sucht nach diesem komplexen Ausdruck.
    -like ist ein simplifizierter -match, der Wildcards unterstützt, da aber auch am Anfang und Ende stehen können:-like "AAAA" vergleicht genau "AAAA".
    like "AAA*" bedeutet Anfang mit AAA und Ende beliebig.
    like "*AAA" Endet mit AAA
    like "*AAA*" enthält irgendwo AAA

    https://www.windowspro.de/script/vergleichsoperatoren-powershell-eq-lt-gt-contains-match

    • Als Antwort markiert -- Chris -- Freitag, 3. Juli 2020 06:14
    Donnerstag, 2. Juli 2020 16:10
  • geht leider trotzdem nicht?

    Import-Module Powershell\xyz.PowerShell.Inventar.dll
    Get-InventoryEntry | where {$_.PcName -like "PCFFF" -and $_.Anwendungen -notcontains "CORONA"} | select -ExpandProperty Anwendungen
    
                                 

    bringt das als Ergebnis! Echt komisch

    Anwendung                                            
    ---------                                     
    ACCESS                                                
    INTRNET                           
    INTRNET/VIDEO
    OFFICE                              
    WINDOWS                           


    Chris


    Freitag, 3. Juli 2020 05:47
  • Moin,

    dann sind die Einträge in der Property "Anwendungen" offenbar selbst noch Objekte, die jeweils die Property "Anwendung" haben.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Freitag, 3. Juli 2020 06:14
    Freitag, 3. Juli 2020 05:51
  • ja das vermute ich auch

    Import-Module Powershell\xyz.PowerShell.Inventar.dll
    $a = Get-InventoryEntry | where {$_.PcName -like "PCFFF" -and $_.Anwendungen -notcontains "CORONA"} | select -ExpandProperty Anwendungen

    $a | Get-Member



       TypeName: xyz.PowerShell.Inventar.InventoryEntryApplication

    Name                    MemberType Definition                               
    ----                    ---------- ----------                               
    Equals                  Method     bool Equals(System.Object obj)           
    GetHashCode             Method     int GetHashCode()                        
    GetType                 Method     type GetType()                           
    ToString                Method     string ToString()                        
    Anwendung               Property   string Anwendung {get;set;}              
    Beschreibung            Property   string Beschreibung {get;set;}           
    GruppeImActiveDirectory Property   string GruppeImActiveDirectory {get;set;}


    Chris


    Freitag, 3. Juli 2020 06:12
  • Ich würde es mal so probieren:

    $a = 
    Get-InventoryEntry | 
    Where-Object { $_.PcName -like "*PCFFF*" -and $_.Anwendungen.Anwendung -notcontains "CORONA" } | 
    Select-Object -ExpandProperty Anwendungen


    Live long and prosper!

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

    • Bearbeitet BOfH-666 Freitag, 3. Juli 2020 15:21
    Freitag, 3. Juli 2020 06:22
  • Ein "-like" ohne Wildcards macht keinen Sinn, dies entsricht auch einen "-eq".
    Also ggf. -like "*PCFFF*".

    Contains dient zum durchsuchen von Arrays oder Collections. Dabei wird jedes Element mittel "-eq" verglichen.
    Enthält das Array/die Collection jedoch Objekte statt Strings, wird die jeweilige ToString()-Methode aufgerufen. Der Standard für Objekte gibt nur den Objektnamen zurück.

    "$_.Anwendungen.Anwendug" greift auf die Eigenschaft jedes Objekts in der List zu die du dann mit notlike vergleichen solltest:

    Where-Object { $_.PcName -like "*PCFFF*" -and $_.Anwendungen.Anwendung -notlike "*CORONA*" } | 
    Select-Object -ExpandProperty Anwendungen

    Vergleiche in Powershell sind auch case insensitive. Für casesensitive Vergleiche gibt es die "-cxxx"-Varianten:
    -ceq, -clike, ...

    Freitag, 3. Juli 2020 13:14
  • "$_.Anwendungen.Anwendug" greift auf die Eigenschaft jedes Objekts in der List zu die du dann mit notlike vergleichen solltest:

    Hmmm ... ich würde erwarten, dass das trotzdem immernoch ein Array ist ... so hier:

    $Array = 
    Get-ChildItem -Path C:\Windows\system32\*.dll | 
    Select-Object -First 20
    $Array.VersionInfo.FileVersion
    Da kommt ja auch kein einzelner String raus, den man sinnvoll mit -like vergleichen könnte. Oder hab ich jetzt wieder 'n Denkfehler?

    Live long and prosper!

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

    Freitag, 3. Juli 2020 13:43
  • Da hast du Recht, hier die Ergänzung:

    Where-Object { $_.PcName -like "*PCFFF*" -and ($_.Anwendungen.Anwendung -join ';') -notlike "*CORONA*" } | 
    Select-Object -ExpandProperty Anwendungen

    Freitag, 3. Juli 2020 14:19
  • OK. Ich sehe, wo Du hin willst. Aber wenn Du Dir bei den einzelnen Elementen in diesem Array sicher bist (perfect match für den -eq Vergleich), kannst Du ja -notContains verwenden, richtig?

    Live long and prosper!

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

    Freitag, 3. Juli 2020 15:23
  • moin,

    ich komme irgendwie mit eine Where leider nicht weiter

    In MS-Access oder SQL sind solche Bedingen relativ einfach.

    where {$_.Anwendungen -notlike "CORONA" -and $_.PcName -like "PC*"

    bringt das als Ergebnis

    ich habe es auch schon mit notmatch probiert. Auch hier kommen leider auch Datensätze mit Corona.  Das CmdLet wurde von einem Kollegen mittels C# erstellt und greift auf eine Oracle DB zu. Kann es sein, dass das Feld/Property  Anwendungen kein String ist und daher die Where Klausel nicht richtig funktioniert?

    InventarNr             : 4324374
    Kategorie              : PC-NETZ
    PcName                 : PC11
    EthernetAdr            : 5065F34E8
    IpAdresse              : 10.1.1.2
    Bemerkung              : Intel i219
    Vorname                : MaX
    Famname                : Mustermann
    BenutzerNr             : Mustermann

    Anwendungen            : {CORONA, INTRNET, AKT2000, OFFICE...}
    MacBytes               : {80, 101, 243, 38...}
    IpBytes                : {10, 160, 216, 238}


    Chris

    Ganz alter Denkfehler... -notlike geht nicht, weil in dem $_.Anwendungen Array ja vermutlich IMMER was enthalten ist, das nicht "CORONA" heißt. Bei irgendeinem Element des Arrays liefert der Filter also $True.

    Andersrum:

    -not ( $_.Anwendungen -like 'CORONA' )

    sollte funktionieren.


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Montag, 6. Juli 2020 07:15
  • Der Test funktioniert nicht, da $_.Anwendungen eine Liste ist und die ToString()-Methode hier nur den Namen des Objekts liefert.

    Aber statt -Join könnte auch funktionieren:

    ($_.Anwendungen.Anwendung -like '*CORONA*').length -eq 0

    Montag, 6. Juli 2020 08:03