De multiples -et -ou en PowerShell Où l'Objet-déclaration
PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object {{ $_.e
xtension-match "xls" -or $_.extension-match "xlk" } -and { $_.creationtime -ge "06/01/2014"}}
Ci-dessus est mon exemple de code. Je suis en train d'exécuter à distance ce PowerShell code sur mon serveur de fichier et l'avoir de retour .xls et .xlk fichiers avec la date de création ou plus tard 6/1/2014. Lorsque j'exécute ce code, il commence à cracher tous les dossiers que l'emplacement distant. Si seulement j'comparer deux choses:
PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object { $_.extension-match "xls" -and $_.creationtime -ge "06/01/2014"}
Uniquement les fichiers xls créé après que l'affichage de la date. Ce qui se passe ici? Ai-je besoin d'utiliser autre chose que nest -and
et -or
déclarations?
Notez qu'à la rupture de la commande en plusieurs "où" les états ne fonctionne pas non plus. Je serais entrer la commande: PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -chemin E:\dfsroots\datastore2\public} | where-Object { $_.ex tension-match "xls" -ou $_.extension-match "xlk" } | where-object { $_.creationtime -ge "06/01/2014"} Et il commence à cracher des fichiers xlsx qui n'est pas ce que je veux.
L'utilisation des parenthèses, pas des accolades pour joindre les options, donc
si vous pouviez m'aider juste une minute, je ne peut pas comprendre ce mini-Markdown mise en forme qui fonctionne et ce qui ne l'est pas. Comment avez-vous placez ce dans un bloc "code"?
Même en utilisant des parenthèses les résultats encore cracher fichiers xlsx.
re: Markdown. cliquez sur le lien aide situé à côté de la zone de commentaire pour la mise en forme de l'aide. Entourer le code avec les backticks
L'utilisation des parenthèses, pas des accolades pour joindre les options, donc
Where{($_.Extension -Match "xls" -or $_.Extension -Match "xlk") -and $_.CreationTime -ge "06/01/2014"}
si vous pouviez m'aider juste une minute, je ne peut pas comprendre ce mini-Markdown mise en forme qui fonctionne et ce qui ne l'est pas. Comment avez-vous placez ce dans un bloc "code"?
Même en utilisant des parenthèses les résultats encore cracher fichiers xlsx.
re: Markdown. cliquez sur le lien aide situé à côté de la zone de commentaire pour la mise en forme de l'aide. Entourer le code avec les backticks
`
.
OriginalL'auteur Winski Tech | 2014-07-10
Vous devez vous connecter pour publier un commentaire.
En enveloppant vos comparaisons dans
{}
dans votre premier exemple, vous créez ScriptBlocks; de sorte que le PowerShell interprète vues commeWhere-Object { <ScriptBlock> -and <ScriptBlock> }
. Depuis le-and
opérateur fonctionne sur des valeurs booléennes, PowerShell jette la ScriptBlocks à des valeurs booléennes. Dans PowerShell tout ce qui n'est pas vide, zéro ou une valeur null est vrai. La déclaration ressemble alors àWhere-Object { $true -and $true }
qui est toujours vrai.Au lieu d'utiliser
{}
, utilisez des parenthèses()
.Aussi, vous souhaitez utiliser
-eq
au lieu de-match
depuis le match utilise des regex et sera vrai si le modèle est trouvé n'importe où dans la chaîne (à essayer:'xlsx' -match 'xls'
).Une meilleure option est de filtrer les extensions à la
Get-ChildItem
commande.Voir mon edit. Le
-match
opérateur va correspondre à n'importe où dans la chaîne.OriginalL'auteur
À l'aide de votre curvy-accolades quand vous devriez être en utilisant parenthèse.
Un où la déclaration est conservé à l'intérieur d'un scriptblock, qui est définie à l'aide de courbes de baces
{ }
. Pour isoler/vous envelopper tests, vous devez utiliser parenthèse()
.Je vous suggère aussi d'essayer de faire du filtrage sur l'ordinateur distant. Essayez:
Tu avais aussi utilisé le mauvais opérateur. Désolé de ne pas attraper. Vous avez besoin d'utiliser
-eq
pour obtenir des correspondances exactes.-match
comprendrait tous les résultats avec les extentions qui contiennent l'expression "xls". 🙂OriginalL'auteur