IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

[astuce] 'Where' à la 'LINQ' avec PowerShell 2.0


Sujet :

Scripts/Batch

  1. #1
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut [astuce] 'Where' à la 'LINQ' avec PowerShell 2.0
    'Where' à la 'LINQ' avec PowerShell 2.0

    Salut,

    cette petite astuce est une amélioration de la nouvelle syntaxe declarative 'Where' en PS 4.0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?xml version="1.0" encoding="utf-8" ?>
    <Types>
        <Type>
            <Name>System.Array</Name>
            <Members>
                 <ScriptMethod>
                    <Name>Where</Name>
                    <Script>
        $arg = $args[0] -as [String]
        $members = ($this |gm -Type *property |select -Unique -Expand name) +'PSItem'
        $members | foreach {
                     if($arg -match $_) {
                        if($Matches[0] -eq 'PSItem')
                        { $arg=$arg.replace($($Matches[0]),'$_')
                        }
                        else 
                        { $arg=$arg.replace($($Matches[0]),$('$_.' + $Matches[0]))
                        } 
                     }
                   }
         $sb=$ExecutionContext.InvokeCommand.NewScriptBlock($arg)
         $this | Where-Object -Filter $sb
                    </Script>
                </ScriptMethod>
            </Members>
        </Type>
    </Types>
    après avoir updater votre fichier de configuration vous pouvez l'utiliser ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PS II> (1..10).Where('PSitem -gt 5 -and (PSitem -band 1)')
    7
    9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PS II> $dir = Get-ChildItem c:\Temp
    PS II> $dir.Where('!psiscontainer -and length -gt 10mb')
    
    
        Répertoire*: c:\Temp
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        10/02/2012     13:30       12mb f35.exe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PS > $dir.Where('$true')
    
    
        Répertoire*: c:\Temp
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    d----        01/05/2012     18:22            Scripts
    -a---        10/02/2012     13:30       12mb f35.exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PS II> (get-process).Where('path -like "*Scripts*"').Where('StartTime')
    PS II> # ou bien:
    PS II> (get-process).Where('path -like "*Scripts*" -and StartTime')

  2. #2
    Membre chevronné
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    une petite amelioration du filtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="utf-8" ?>
    <Types>
        <Type>
            <Name>System.Array</Name>
            <Members>
                 <ScriptMethod>
                    <Name>Where</Name>
                    <Script> 
        $arg = $args[0] -as [String]
        $members = ($this |gm -Type *property |select -Unique -Expand name) +'PSItem'
        $members | foreach {
                     if($arg -match "\b$_\b") {
                        if($Matches[0] -eq 'PSItem')
                        { $arg=$arg -replace "(?&lt;=\W|^)$_\b",'$$_'
                        }
                        else 
                        { $arg=$arg -replace "(?&lt;=\W|^)$_\b",'$$_.$0'
                        } 
                     }
                   }
         $sb=$ExecutionContext.InvokeCommand.NewScriptBlock($arg)
         $this | Where-Object -Filter $sb
                    </Script>
                </ScriptMethod>
            </Members>
        </Type>
    </Types>


    apres que vous mettiez à jour le fichier de configuration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PS II> update-typeData $env:script/dsc/dfe.ps1xml -verbose
    vous pouvez maintenant l'utilisez ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PS II> $items = Get-ChildItem $env:windir
    PS II> $items.Where("VersionInfo.isPatched") | select -expand name
    
    45.exe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PS II> (0:0:0 421,00) PS > $items.Where("!PSISContainer -and (Length -gt 2mb -or basename -like '*e')")
    
    
        Répertoire*: D:\WINDOWS
    
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        30/04/2011     16:55          0 Trace.log
    -a---        05/08/2013     06:54      5.6mb Win3.log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PS II> (get-process).where("StartTime -and Path -and name.length -lt 4")
    
    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
    -------  ------    -----      ----- -----   ------     -- -----------
         40       3     1028       3456    31     0,28   1496 osk
    à noter que la propriété PSitem est l'objet en court passé par le pipeline en d'autre terme "$_"

Discussions similaires

  1. Linq avec LEFT JOIN, agrégat et where
    Par Jean-Marc68 dans le forum Linq
    Réponses: 4
    Dernier message: 14/07/2014, 13h30
  2. LINQ avec plusieurs clauses WHERE et C#
    Par Cedric33 dans le forum Linq
    Réponses: 23
    Dernier message: 22/11/2011, 14h29
  3. [where] requete sql avec OR qui déconne
    Par nannous dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/01/2007, 12h02
  4. WHERE ou ON avec un IF
    Par Naora dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/10/2006, 09h19
  5. [TIP/Astuce] Enregistrer login/mdp avec votre navigateur
    Par Maxoo dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 22/04/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo