Mit Powershell 3 wird die foreachAnweisung nicht wiederholt $nullund das von OP beschriebene Problem tritt nicht mehr auf.
Von der Windows Powershell - Blog Post New V3 Sprach - Features :
Die ForEach-Anweisung iteriert nicht über $ null
In PowerShell V2.0 waren die Benutzer häufig überrascht von:
PS> foreach ($i in $null) { 'got here' }
got here
Diese Situation tritt häufig auf, wenn ein Cmdlet keine Objekte zurückgibt. In PowerShell V3.0 müssen Sie keine if-Anweisung hinzufügen, um zu vermeiden, dass über $ null iteriert wird. Wir kümmern uns darum für Sie.
Für PowerShell finden $PSVersionTable.PSVersion.Major -le 2Sie die ursprüngliche Antwort im Folgenden.
Sie haben zwei Möglichkeiten, ich benutze meistens die zweite.
Überprüfen Sie, ob dies $backupsnicht der Fall ist $null. Eine einfache Ifum die Schleife kann auf nicht prüfen$null
if ( $backups -ne $null ) {
foreach ($file in $backups) {
Remove-Item $file.FullName;
}
}
Oder
$backupsAls Null-Array initialisieren . Dies vermeidet die Mehrdeutigkeit des Problems "iteriertes leeres Array", nach dem Sie in Ihrer letzten Frage gefragt haben .
$backups = @()
# $backups is now a null value array
foreach ( $file in $backups ) {
# this is not reached.
Remove-Item $file.FullName
}
Entschuldigung, ich habe es versäumt, ein Beispiel für die Integration Ihres Codes anzugeben. Beachten Get-ChildItemSie das im Array eingeschlossene Cmdlet. Dies würde auch mit Funktionen funktionieren, die a zurückgeben könnten $null.
$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
}