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

Oben ist mein Codebeispiel. Ich versuche, diesen PowerShell-Code auf meinem Dateiserver remote auszuführen und alle .xls- und .xlk-Dateien mit einem Erstellungsdatum am oder nach dem 01.06.2014 zurückgeben zu lassen. Wenn ich diesen Code ausführe, spuckt er alle Ordner an diesem entfernten Ort aus. Wenn ich vergleiche nur zwei Dinge, wie so:Mehrere -und -oder in PowerShell Where-Object-Anweisung

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

Nur die xls-Dateien an oder nach diesem Datum Anzeige erstellt. Was ist denn hier los? Muss ich etwas anderes als nest -and und -or Anweisungen verwenden?

+0

Beachten Sie, dass die Aufschlüsselung des Befehls in mehrere "Where" -Absätze auch nicht funktioniert. Ich würde einen Befehl wie eingeben: PS H: \> Invoke-Command-Computername SERVERNAME {Get-ChildItem -path E: \ dfsroots \ datastore2 \ public} | Where-Object {$ _. Ex tension-match "xls" -oder $ _. Extension-match "xlk"} | where-object {$ _. creationtime -ge "06/01/2014"} Und es beginnt Xlsx-Dateien auszuspucken, was nicht das ist, was ich will. –

+0

Verwenden Sie Klammern nicht geschweifte Klammern, um Optionen einzuschließen, also 'Where {($ _. Extension -Match" xls "-oder $ _. Extension -Match" xlk ") -und $ _. CreationTime -ge" 06/01/2014 "}' – TheMadTechnician

+0

@TheMadTechnician, wenn Sie mir nur eine Minute helfen konnte ich nicht herausfinden, was Mini-Markdown-Formatierung funktioniert und was nicht. Wie haben Sie das in einen "Code" -Block eingefügt? –

Antwort

20

Indem Sie Ihre Vergleiche in {} in Ihrem ersten Beispiel verpacken, erstellen Sie ScriptBlocks; Der PowerShell-Interpreter betrachtet es als Where-Object { <ScriptBlock> -and <ScriptBlock> }. Da der Operator -and mit booleschen Werten arbeitet, wandelt PowerShell die ScriptBlocks in boolesche Werte um. In PowerShell ist alles, was nicht leer ist, null oder null wahr. Die Aussage sieht dann wie Where-Object { $true -and $true } aus, was immer wahr ist.

Verwenden Sie anstelle von {} die Klammern ().

Auch wollen Sie -eq statt -match verwenden, da Match regex verwendet und wird wahr sein, wenn das Muster überall in der Zeichenfolge gefunden wird (versuchen: '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")} 
} 

Eine bessere Option ist die Erweiterungen am Get-ChildItem Befehl zu filtern.

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

Klammer hat das Problem nicht behoben, nur geändert, was herauskam, ich bekomme xlsx-Dateien, wenn alles, was ich suche nach xls und xlk-Dateien ist. –

+0

Siehe meine Bearbeitung. Der "match" -Operator wird überall in der Zeichenfolge übereinstimmen. – Rynant

1

Sie verwenden kurvige Klammern, wenn Sie Klammern verwenden sollten.

Eine Where-Anweisung wird in einem Skriptblock gespeichert, der mit kurvigen Baces { } definiert wird. Um Ihre Tests zu isolieren/umhüllen, sollten Sie die Klammern () verwenden.

Ich würde auch vorschlagen, die Filterung auf dem Remote-Computer zu tun. Versuchen Sie:

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

Klammer hat das Problem nicht behoben, nur geändert, was herauskam, ich bekomme xlsx-Dateien, wenn alles, was ich suche nach xls und xlk-Dateien ist. –

+0

Sie hatten auch den falschen Operator benutzt. Tut mir leid, dass ich das nicht verstanden habe. Sie müssen '-eq' verwenden, um genaue Übereinstimmungen zu erhalten. "match" würde alle Ergebnisse mit Erweiterungen einschließen, die den Ausdruck "xls" enthalten. :) –