Powershell: Błędu nie ma, a polecenie nie działa

26-lut-2019

Mamy niby proste polecenie:

ls -Recurse C:\Users\admin\Documents\| 
Select-Object Name,CreationTime | 
Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}

Niestety nic nie jest wyświetlane, a na pewno w tym katalogu są pliki TXT utworzone wcześniej niż 2 dni temu. O co chodzi?

ls zwraca obiekty, które mają duuużo właściwości, między innymi Name, CreationTime i Extension

Potem te obiekty przechodzą do Select, a select to chirurg, który wyciął wszystko oprócz Name i CreationTime. Czyli teraz ten obiekt ma już +/- tylko 2 właściwości: Name i CreationTime, ale nie ma Extension

Potem w Where każemy wyświetlić tylko te pliki, które mają odpwiedni CreationTime i z tym nie ma problemu, ale dodatkowo chcemy mieć określony Extension… a tej właściwości na tym etapie już nie ma.

Co zrobić? Można zmień kolejność – napierw Where a potem Select i będzie ok:

 ls -Recurse C:\Users\rafal\Documents | 
 Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")} |
 Select-Object CreationTime,Name, Extension

Drugie rozwiązanie, to dodać do listy właściwości w poleceniu Select dodatkowej właściwości Extension:

 ls -Recurse C:\Users\rafal\Documents | 
 Select-Object CreationTime,Name, Extension | 
  Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}

 

 

Komentarze są wyłączone

Autor: Rafał Kraik