Unterschiedliche Ergebnisse zwischen "PowerShell ISE" und "Mit PowerShell ausführen"

1881
eliko

Ich habe zwei einfache einzeilige "Skripte". Sie prüfen, wie alt bestimmte Dateien in bestimmten Ordnern sind. Eine zeigt die Ausgabe auf dem Bildschirm an und die andere schreibt die Ausgabe in eine Textdatei auf dem Desktop. Beide ".ps1" -Skriptdateien werden auf dem Desktop gespeichert. Wenn Sie eine ".ps1" -Datei mit "Mit PowerShell ausführen" ausführen, werden die Ergebnisse nicht korrekt angezeigt. Wenn Sie eine ".ps1" -Datei über PowerShell ISE ausführen, ist das Ergebnis anders (und korrekt).

Das erste Skript:

cd G:\moveh\back Get-ChildItem -filter "*.rar" | Foreach-Object { if ( ((get-date).toshortdatestring() ) -gt ($_.lastwritetime.toshortdatestring() ) ) { " " -f $_.name,$_.lastwritetime.toshortdatestring()} }  cmd /c pause 

Das zweite Skript:

Get-ChildItem $allfolders | where {$_.Name -notlike "*closed"} | gci - Recurse -File -filter "Data.rar" | where {( ($_.lastwritetime.toshortdatestring()) -lt ((get-date).AddDays(-1).ToShortDateString() ) ) } | format-table -autosize -Property Directory, Name, LastWriteTime > C:\Users\itsupport\Desktop\Files_2b_updated_DB.txt 

Ein Beispiel-Screenshot mit den zwei unterschiedlichen Ergebnissen für das erste Skript:

1

Irgendwelche Ideen, warum es unterschiedliche Ergebnisse gibt?

1

1 Antwort auf die Frage

1
beatcracker

Sie gießen Datumsangaben in Strings und dies führt zu unterschiedlichen Ergebnissen in der ISE- und PowerShell-Konsole.

Schau dir deine from073.rarDatei an:

  • ISE-Datum: 10/05 / 2015
  • Datum der PowerShell-Konsole: 5/10 / 2015

Du solltest besser loswerden .ToShortDateString()und Termine direkt vergleichen. Siehe diese Frage: Powershell: Datumsvergleich

Obwohl die Zeichenfolgen in ISE und in der PowerShell-Konsole unterschiedlich dargestellt werden, ist der Vergleich Äpfel zu Äpfeln, daher sollten die Ergebnisse gleich sein.

Ja, aber Ihre "Äpfel" sind in diesem Fall Zeichencodes. Ich bin mir sicher, dass dies nicht das ist, was Sie vergleichen wollten. Beispiel:

  • 'a' -gt 'b'ist false, weil der Zeichencode von aniedriger ist als der Zeichencode von b.

  • 'ac' -gt 'ab'ist true, weil der Zeichencode afür beide Zeichenfolgen derselbe ist, der nächste Zeichencode der linken Zeichenfolge ( c) jedoch größer ist als der zweite Zeichencode der rechten Zeichenfolge ( b).

Wenn Sie also Code in ISE ausführen, der dd/mm/yyyyformat verwendet, vergleicht Ihr Code nur den ersten ddTeil und ignoriert ihn mm/yyyy, da er zufällig gleich ist. Und Sie erhalten durch reinen Zufall korrekte Ergebnisse. Das Datumsformat in der PowerShell-Konsole ist also mm/dd/yyyy, so dass Ihr Code wie gewünscht bricht.

Dies ist meine neue Linie:

Get-ChildItem -filter "*.rar" | Foreach-Object { if((get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d )) { " " -f $_.name, (get-date $_.lastwritetime -Format d) } } 

Aber der Vergleich funktioniert nicht.

Nun geht es wieder: Sie verwenden -Format d, was das Datumsobjekt in einen String konvertiert. Und Sie wissen schon, wohin es führt.

Wenn Sie Dateien erhalten möchten, die älter als ein Tag sind, sollte Ihr Code folgendermaßen aussehen (beachten Sie, wie zwei DateTime- Objekte direkt verglichen werden, keine Zeichenfolgen betroffen):

Get-ChildItem -Filter '*.rar' | Foreach-Object { if($_.LastWriteTime -lt (Get-Date).AddDays(-1)) { ' ' -f $_.Name, $_.LastWriteTime } }  
Ich habe zwei Folgefragen: 1) Obwohl die Zeichenfolgen in ISE und in der PowerShell-Konsole unterschiedlich dargestellt werden, ist der Vergleich Äpfel zu Äpfeln, daher sollten die Ergebnisse gleich sein. In der obigen Abbildung werden in ISE in der Ausgabe Dateinamen angezeigt, die nicht in der PowerShell-Konsole angezeigt werden, und umgekehrt. Warum das? eliko vor 9 Jahren 0
2. Dies ist meine neue Zeile: `Get-ChildItem -filter" * .rar "| Foreach-Object " -f $ _. Name, (get-date $ _.lastwritetime -Format d)}} `Aber der Vergleich funktioniert nicht. Ich habe einen Testordner mit 10 Dateien erstellt. Das Ergebnis des Vergleichs enthält keine Dateien, die älter als ein Tag sind. Bitte [siehe Beispiel-Screenshot] (http://imgur.com/CBu4OGk) eliko vor 9 Jahren 0
@eliko Siehe aktualisierte Antwort. beatcracker vor 9 Jahren 0