Za pomocą programu Powershell v2.0 Chcę usunąć wszystkie pliki starsze niż X dni:
$backups = Get-ChildItem -Path $Backuppath |
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-$DaysKeep)) -and (-not $_.PSIsContainer) -and ($_.Name -like "backup*")}
foreach ($file in $backups)
{
Remove-Item $file.FullName;
}
Jednak gdy kopie zapasowe $ są puste, otrzymuję: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
Próbowałem:
- Ochrona foreach za pomocą
if (!$backups)
- Ochrona elementu usuwanego za pomocą
if (Test-Path $file -PathType Leaf)
- Ochrona elementu usuwanego za pomocą
if ([IO.File]::Exists($file.FullName) -ne $true)
Wydaje się, że żaden z nich nie działa, a jeśli zalecany sposób zapobiegania wprowadzaniu pętli foreach, jeśli lista jest pusta?
powershell
SteB
źródło
źródło
Odpowiedzi:
W Powershell 3
foreach
instrukcja nie jest powtarzana,$null
a problem opisany przez OP już nie występuje.Z postu na blogu Windows PowerShell Nowe funkcje języka V3 :
W przypadku programu PowerShell
$PSVersionTable.PSVersion.Major -le 2
zobacz oryginalną odpowiedź poniżej.Masz dwie opcje, najczęściej używam drugiej.
Sprawdź,
$backups
czy nie$null
. ProstaIf
pętla może sprawdzić, czy nie$null
Lub
Zainicjuj
$backups
jako tablica zerowa. Pozwala to uniknąć dwuznaczności problemu „iteruj pustą tablicę” , o który pytałeś w swoim ostatnim pytaniu .Przepraszam, ale nie podałem przykładu integrującego twój kod. Zwróć uwagę na
Get-ChildItem
cmdlet zawinięty w tablicę. Działa to również z funkcjami, które mogą zwrócić a$null
.źródło
Wiem, że to stary post, ale chciałbym zauważyć, że polecenie cmdlet ForEach-Object nie ma tego samego problemu, co użycie słowa kluczowego ForEach. Możesz więc przesłać wyniki DIR do ForEach i po prostu odwołać się do pliku za pomocą $ _, na przykład:
Możesz faktycznie przesłać polecenie Dir przez potok i unikać nawet przypisywania zmiennej, takiej jak:
Dodałem podziały linii dla czytelności.
Rozumiem niektóre osoby, takie jak ForEach / In, pod względem czytelności. Czasami obiekt ForEach może być trochę owłosiony, szczególnie jeśli zagnieżdżasz się, ponieważ trudno jest podążać za referencją $ _. W każdym razie do takiej małej operacji jest idealna. Wiele osób twierdzi również, że jest to szybsze, ale stwierdziłem, że jest to tylko nieznacznie.
źródło
foreach
Instrukcja już nie wkracza$null
, więc błąd opisany przez OP już nie występuje. Zobacz sekcję „Instrukcja ForEach nie przechodzi przez $ null” w blogu Powershell Nowe funkcje języka V3 .Opracowałem rozwiązanie, uruchamiając zapytanie dwukrotnie, raz, aby pobrać pliki i raz policzyć pliki, przesyłając get-ChilItem w celu zwrócenia tablicy (rzutowanie $ backups jako tablicy po tym, jak wydaje się to nie działać) .
Przynajmniej działa zgodnie z oczekiwaniami (wydajność nie powinna być tak istotna, ponieważ nigdy nie będzie więcej niż tuzin plików), jeśli ktoś wie o rozwiązaniu do jednego zapytania, opublikuj je.
źródło
Wykonaj następujące czynności, aby ocenić, czy tablica ma jakąkolwiek zawartość:
Jeśli zmienna nie istnieje, PowerShell po prostu oceni ją jako fałsz, więc nie trzeba sprawdzać, czy istnieje.
źródło