2016-09-08 12 views
0

Ich bin neu bei Powershell und Scripting im Allgemeinen. Viel lesen und testen und das ist mein erster Beitrag.
Hier ist was ich versuche zu tun. Ich habe einen Ordner, der Unterordner für jeden Bericht enthält, der täglich ausgeführt wird. Ein neuer Unterordner wird jeden Tag erstellt.
Die Dateinamen in den Unterordnern sind identisch, nur das Datum wird geändert. Ich möchte eine bestimmte Datei aus dem Ordner gestern erhalten.
Hier ist, was ich bisher:PowerShell finde die neueste Datei

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | where(get-date).AddDays(-1) 

Beide Teile (vor und nach Rohr) zu arbeiten. Aber wenn ich sie kombiniere, scheitert es. Was mache ich falsch?

Antwort

0

lesen Ausgabe von get-date | Get-Member -MemberType Property und dann Where-Object docs gelten:

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | ` 
    Where-Object {$_.LastWriteTime.Date -eq (get-date).AddDays(-1).Date} 
0

Versuchen:

where {$_.lastwritetime.Day -eq ((get-date).AddDays(-1)).Day} 
0

Sie könnten Rohr die Ergebnisse an den Sort Befehl und Rohr, dass nur Select, um das erste Ergebnis.

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | Sort LastWriteTime -Descending | Select -First 1 
1

Was mache ich falsch?

0,1,2,3,4,5 | Where { $_ -gt 3 } 

dies wird die eingehende Nummer aus der Pipeline ($_) mit 3 und erlauben Dinge zu vergleichen, die als 3 größer sind vorbei, es zu erhalten - wann immer der $_ -gt 3 Test Getreu $ auswertet.

0,1,2,3,4,5 | where { $_ } 

dies nichts gegen vergleichen hat - in diesem Fall ist es casts the value to boolean - 'truthy' or 'falsey' und wird alles ‚truthy‘ erlauben, durch zu bekommen. 0 ist gefallen, der Rest ist erlaubt.

Get-ChildItem | where Name -eq 'test.txt' 

ohne {} ist eine Syntax, wo es erwartet Nameist eine Eigenschaft der Sache durch die Pipeline kommt (in diesem Fall Dateinamen) und vergleicht die gegen ‚test.txt‘ und erlaubt nur Objekte Datei mit diesem Namen zu durchlaufen.

Get-ChildItem | where Length 

In diesem Fall ist die Eigenschaft es suchen ist, ist Länge (die Dateigröße) und es gibt keinen Vergleich gegeben, so dass es wieder zu tun, die „Casting zu wahr/falsch“, was von früher. Dies zeigt nur Dateien mit einem Inhalt (Länge ungleich 0) an und löscht beispielsweise Dateien mit der Größe 0.

ok, das bringt mich auf Ihren Code:

Get-ChildItem | where(get-date).AddDays(-1) 

Ohne {} und nur eine Sache gegeben Wo, es erwartet, dass die Parameter einen Eigenschaftsnamen zu sein, und wirft den Wert dieser Eigenschaft auf richtig/falsch zu entscheiden, was zu tun ist. Das heißt "Filter wo * die Dinge in der Pipeline haben eine Eigenschaft namens ("09/08/2016 14:12:06" (gestriges Datum mit der aktuellen Zeit)) und der Wert dieser Eigenschaft ist 'truthy'". Keine Datei hat eine Eigenschaft namens (gestriges Datum), so dass die Frage $null für jede Datei lautet und Where alles aus der Pipeline löscht.

Sie können tun, als Jimbo Antworten und Filter zu vergleichen das Datum der Schreibzeit gegen gestrige Datei. Aber wenn Sie wissen, dass die Dateien und Ordner in der Datumsreihenfolge benannt sind, können Sie -recursed durch die gesamte Ordnerstruktur und alles betrachten, weil Sie wissen, was gestern Datei aufgerufen wird.

Obwohl Sie nicht sagen, Sie tun können, nähert sich entweder wie

$yesterday = (Get-Date).AddDays(-1).ToString('MM-dd-yyyy') 
Get-ChildItem "d:\receive\bhm\$yesterday\MBVOutputQueriesReport_C12_Custom.html" 

# (or whatever date pattern gets you directly to that file) 

oder

Get-ChildItem | sort -Property CreationTime -Descending | Select -Skip 1 -First 1 

die ‚vorletzter‘ Sache, durch Reverse erstellt Datum geordnet zu erhalten.

+0

Hervorragende Erklärung. Antworten wie diese sind viel hilfreicher als das "hier ist dein One Liner" speziell für Anfänger. – StephenP

+0

Vielen Dank für die Erklärung und den Rat. Ich werde weiter lesen und lernen. – jcarreiro

0

Kann so etwas tun.

$time = (get-date).AddDays(-1).Day 
Get-ChildItem -Filter "MBVOutputQueriesReport_C12_Custom.html" -Recurse -Path D:\BHM\Receive\ | Where-Object { $_.LastWriteTime.Day -eq $time } 
Verwandte Themen