Witam,
Piszę skrypt w PowerShellu do obsługi logów (można założyć że zwykłe pliki *.txt w danym folderze) i chciałbym wyselekcjonować te nazwy plików w tym folderze względem dzisiejszej daty (to zrobione). Moim wynikiem są nazwy logów z dnia: dziś. Mając tę informację chciałbym nazwy plików wyselekcjonować otrzymując tylko te, które zawierają ostatnie pięć znaków np. "th.txt".
Przykładowo mam wynik logów z dnia: dziś:
log1-222.txt
log2-333.txt
log3-th.txt
log5-322th.txt
log9-333th.tx
I chciałbym uzyskać z kolejnej modyfikacji algorytmu:
log3-th.txt
log5-322th.txt
log9-333th.txt
Przeszukałem wiele stron na ten temat i próba stosowania dot-netowych metod do wycinania fragmentów z tekstu nie działała w FOREACH. Nie chcę tego robić w C++ czy C# bo zależy mi na skrypcie gdyż można go szybko edytować i przejrzeć jego strukturę bez uruchamiania środowiska.
Mój algorytm:
$todayData = get-date
$nameOfFile= Get-ChildItem 'E:\Logi' -Filter *.txt | `
where {$_.lastWritetime.month -eq $todayData.month -AND $_.lastWritetime.day -eq $todayData.day -AND $_.lastWritetime.year -eq $todayData.year } | `
format-Table Name
$nameOfFile
To daje w wyniku nazwy plików z dzisiejszego dnia. Pomysły miałem różne i nie wychodziły, np:
$todayData = get-date
$nameOfFile= Get-ChildItem 'E:\Logi' -Filter *.txt | `
where {$_.lastWritetime.month -eq $todayData.month -AND $_.lastWritetime.day -eq $todayData.day -AND $_.lastWritetime.year -eq $todayData.year } | `
format-Table Name
$nameOfFile
foreach($item in $nameOfFile)
{
if($item.EndsWith("th.txt"))
{
$item
}
}
Ale żadnych metod nie mogę używać w pętli 'foreach'. Wynik kończy się błędami typu:
Method invocation failed because [Microsoft.PowerShell.Commands.Internal.Format.GroupStartData] doesn't contain a method named 'EndsWith'.
At G:\SecondProject\dateOfFile.ps1:8 char:18
+ if($item.EndsWith <<<< ("th.txt"))
+ CategoryInfo : InvalidOperation: (EndsWith:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Użycie przed pętlą tej samej metody na sztywnej zmiennej tak jak:
$nazwa="blablath.txt"
$nazwa.EndsWith("th.txt")
Da wynik true.
Jak mogę to zrobić na wynikowych nazwach plików ?
Jeszcze z ciekawszych pomysłów to:
([string]$item).EndsWith("th.txt"))
Ale fragment "[string]" nie jest równoważny z rzutowaniem typu ? Bo wynik był oczywiście false z powodu takiego, że
[string]$item
daje w wyniku Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
Ale nie korzystając z rzutowania i pisząc $item.toString()
otrzymuje ten sam wynik co rzutując. ^^
Może ktoś mi pomóc jak się uporać z tym?