Con Powershell 3 l' foreach
istruzione non viene ripetuta $null
e il problema descritto da OP non si verifica più.
Dal post del blog di Windows PowerShell Nuove funzionalità della lingua V3 :
Ogni istruzione ForEach non esegue l'iterazione su $ null
In PowerShell V2.0, le persone erano spesso sorprese da:
PS> foreach ($i in $null) { 'got here' }
got here
Questa situazione si presenta spesso quando un cmdlet non restituisce alcun oggetto. In PowerShell V3.0, non è necessario aggiungere un'istruzione if per evitare iterazioni su $ null. Ci prendiamo cura di questo per te.
Per PowerShell $PSVersionTable.PSVersion.Major -le 2
vedere quanto segue per la risposta originale.
Hai due opzioni, io uso principalmente la seconda.
Controlla $backups
di no $null
. Un semplice If
giro del ciclo può controllare se no$null
if ( $backups -ne $null ) {
foreach ($file in $backups) {
Remove-Item $file.FullName;
}
}
O
Inizializza $backups
come array null. Questo evita l'ambiguità del problema di "iterazione di array vuoti" di cui hai chiesto l'ultima domanda .
$backups = @()
# $backups is now a null value array
foreach ( $file in $backups ) {
# this is not reached.
Remove-Item $file.FullName
}
Siamo spiacenti, ho dimenticato di fornire un esempio di integrazione del codice. Si noti il Get-ChildItem
cmdlet avvolto nella matrice. Ciò funzionerebbe anche con funzioni che potrebbero restituire a $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
}