Mit Powershell v2.0 möchte ich alle Dateien löschen, die älter als X Tage sind:
$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;
}
Wenn jedoch $ backups leer ist, erhalte ich: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
Ich habe es versucht:
- Schutz des Foreach mit
if (!$backups)
- Schutz des Entfernungsgegenstandes mit
if (Test-Path $file -PathType Leaf)
- Schutz des Entfernungsgegenstandes mit
if ([IO.File]::Exists($file.FullName) -ne $true)
Keines davon scheint zu funktionieren. Was ist, wenn die empfohlene Methode, um zu verhindern, dass eine foreach-Schleife eingegeben wird, wenn die Liste leer ist?
powershell
SteB
quelle
quelle
Antworten:
Mit Powershell 3 wird die
foreach
Anweisung nicht wiederholt$null
und das von OP beschriebene Problem tritt nicht mehr auf.Von der Windows Powershell - Blog Post New V3 Sprach - Features :
Für PowerShell finden
$PSVersionTable.PSVersion.Major -le 2
Sie die ursprüngliche Antwort im Folgenden.Sie haben zwei Möglichkeiten, ich benutze meistens die zweite.
Überprüfen Sie, ob dies
$backups
nicht der Fall ist$null
. Eine einfacheIf
um die Schleife kann auf nicht prüfen$null
Oder
$backups
Als Null-Array initialisieren . Dies vermeidet die Mehrdeutigkeit des Problems "iteriertes leeres Array", nach dem Sie in Ihrer letzten Frage gefragt haben .Entschuldigung, ich habe es versäumt, ein Beispiel für die Integration Ihres Codes anzugeben. Beachten
Get-ChildItem
Sie das im Array eingeschlossene Cmdlet. Dies würde auch mit Funktionen funktionieren, die a zurückgeben könnten$null
.quelle
Ich weiß, dass dies ein alter Beitrag ist, aber ich möchte darauf hinweisen, dass das Cmdlet ForEach-Object nicht das gleiche Problem hat wie die Verwendung des Schlüsselworts ForEach. Sie können also die Ergebnisse von DIR an ForEach weiterleiten und einfach mit $ _ auf die Datei verweisen, z.
Sie können den Dir-Befehl selbst über die Pipe weiterleiten und vermeiden, die Variable wie folgt zuzuweisen:
Ich habe Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt.
Ich verstehe einige Leute wie ForEach / In für die Lesbarkeit. Manchmal kann das ForEach-Objekt etwas haarig werden, besonders wenn Sie verschachteln, da es schwierig wird, der $ _ - Referenz zu folgen. Auf jeden Fall ist es für eine kleine Operation wie diese perfekt. Viele Leute behaupten auch, es sei schneller, aber ich habe festgestellt, dass dies nur geringfügig ist.
quelle
foreach
Anweisung jedoch nicht mehr ein$null
, sodass der von OP beschriebene Fehler nicht mehr auftritt. Weitere Informationen finden Sie im Abschnitt "ForEach-Anweisung iteriert nicht über $ null" im Powershell-Blogbeitrag Neue Funktionen der V3-Sprache .Ich habe eine Lösung entwickelt, indem ich die Abfrage zweimal ausgeführt habe, einmal, um die Dateien abzurufen, und einmal, um die Dateien zu zählen, indem ich get-ChilItem gecastet habe, um ein Array zurückzugeben ($ Backups als Array zu werfen, nachdem die Tatsache nicht zu funktionieren scheint) .
Zumindest funktioniert es wie erwartet (Leistung sollte nicht so problematisch sein, da es nie mehr als ein Dutzend Dateien geben wird). Wenn jemand eine Lösung mit nur einer Abfrage kennt, posten Sie sie bitte.
quelle
Verwenden Sie Folgendes, um zu bewerten, ob das Array Inhalt enthält:
Wenn die Variable nicht vorhanden ist, bewertet Powershell sie einfach als falsch, sodass nicht überprüft werden muss, ob sie vorhanden ist.
quelle