Multiple -and -or in PowerShell Where-Object statement
powershell, windows-7, windows-server-2003, windows-server-2008
Solution
By wrapping your comparisons in `{}` in your first example you are creating ScriptBlocks; so the PowerShell interpreter views it as `Where-Object { <ScriptBlock> -and <ScriptBlock> }`. Since the `-and` operator operates on boolean values, PowerShell casts the ScriptBlocks to boolean values. In PowerShell anything that is not empty, zero or null is true. The statement then looks like `Where-Object { $true -and $true }` which is always true.
Instead of using `{}`, use parentheses `()`.
Also you want to use `-eq` instead of `-match` since match uses regex and will be true if the pattern is found anywhere in the string (try: `'xlsx' -match 'xls'`).
Invoke-Command -computername SERVERNAME {
Get-ChildItem -path E:\dfsroots\datastore2\public |
Where-Object {($_.extension -eq ".xls" -or $_.extension -eq ".xlk") -and ($_.creationtime -ge "06/01/2014")}
}
A better option is to filter the extensions at the `Get-ChildItem` command.
Invoke-Command -computername SERVERNAME {
Get-ChildItem -path E:\dfsroots\datastore2\public\* -Include *.xls, *.xlk |
Where-Object {$_.creationtime -ge "06/01/2014"}
}
Problem
``` 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"}} ``` Above is my code example. I'm trying to remotely run this PowerShell code on my file server and have it return all .xls and .xlk files with a creation date on or later than 6/1/2014. When I run this code it starts spitting out all of the folders in that remote location. If I only compare two things like so: ``` PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object { $_.extension-match "xls" -and $_.creationtime -ge "06/01/2014"} ``` Only the xls files created on or after that date display. What's going on here? Do I need to use something other than nest `-and` and `-or` statements?