12
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"}} 

Sopra è il mio esempio di codice. Sto tentando di eseguire in remoto questo codice PowerShell sul mio file server e farlo restituire tutti i file .xls e .xlk con una data di creazione entro il 6/1/2014. Quando eseguo questo codice, inizia a sputare tutte le cartelle in quella posizione remota. Se confronto solo due cose in questo modo:Multiple -and -o in PowerShell istruzione Where-Object

PS H:\> Invoke-Command -computername SERVERNAME { Get-ChildItem -path E:\dfsroots\datastore2\public} | Where-Object { $_.extension-match "xls" -and $_.creationtime -ge "06/01/2014"} 

solo i file xls creati a partire da tale visualizzazione della data. Cosa sta succedendo qui? Devo utilizzare qualcosa di diverso dalle dichiarazioni nidificate -and e -or?

+0

Si noti che suddividere il comando in più istruzioni "where" non ha funzionato neanche. Vorrei inserire un comando come: PS H: \> Invoke-Command -computername SERVERNAME {Get-ChildItem -path E: \ dfsroots \ datastore2 \ public} | Where-Object {$ _. Ex tension-match "xls" -o $ _. Extension-match "xlk"} | where-object {$ _. creationtime -ge "06/01/2014"} E inizia a sputare file xlsx che non è quello che voglio. –

+0

Usa parentesi non parentesi graffe per racchiudere le opzioni, quindi 'Dove {($ _. Extension -Match" xls "-o $ _. Extension -Match" xlk ") -e $ _. CreationTime -ge" 06/01/2014 "}' – TheMadTechnician

+0

@ TheMadTechnician se puoi aiutarmi solo un minuto non riesco a capire quale sia la formattazione mini-Markdown e cosa no. Come lo hai racchiuso in un blocco "codice"? –

risposta

20

Se si eseguono i confronti in {} nel primo esempio, viene creato ScriptBlocks; quindi l'interprete di PowerShell lo vede come Where-Object { <ScriptBlock> -and <ScriptBlock> }. Poiché l'operatore -and opera su valori booleani, PowerShell esegue il cast di ScriptBlocks su valori booleani. In PowerShell tutto ciò che non è vuoto, zero o null è vero. L'affermazione sembra quindi Where-Object { $true -and $true } che è sempre vera.

Invece di utilizzare {}, utilizzare le parentesi ().

anche voi volete utilizzare -eq invece di -match poiché partita utilizza regex e sarà vero se il modello si trova in qualsiasi punto della stringa (provare: '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")} 
} 

Una soluzione migliore è quella di filtrare le estensioni al comando Get-ChildItem.

Invoke-Command -computername SERVERNAME { 
    Get-ChildItem -path E:\dfsroots\datastore2\public\* -Include *.xls, *.xlk | 
     Where-Object {$_.creationtime -ge "06/01/2014"} 
} 
+0

Parentesi non ha risolto il problema, ha cambiato solo ciò che è uscito, sto ricevendo i file xlsx quando tutto quello che sto cercando di cercare sono i file xls e xlk. –

+0

Vedere la mia modifica. L'operatore '-match' corrisponderà ovunque nella stringa. – Rynant

1

vostro usando curvy-parentesi quando si dovrebbe utilizzare parantheses.

Una dichiarazione where viene mantenuta all'interno di un blocco di script, definito utilizzando i curvy baces { }. Per isolare/avvolgere i test, è necessario utilizzare le paraste ().

Vorrei anche suggerire di provare a fare il filtraggio sul computer remoto. Prova:

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" } 
} 
+0

Parentesi non ha risolto il problema, ha cambiato solo ciò che è venuto fuori, ricevo i file xlsx quando tutto quello che sto cercando di cercare sono i file xls e xlk. –

+0

Hai anche utilizzato l'operatore sbagliato. Scusa per non averlo capito. Devi usare '-eq' per ottenere corrispondenze esatte. '-match' includerebbe tutti i risultati con estensioni contenenti la frase" xls ". :) –