Con Powershell v2.0, quiero eliminar cualquier archivo anterior a X días:
$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;
}
Sin embargo, cuando $ backups está vacío, obtengo: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
He intentado:
- Protegiendo el foreach con
if (!$backups)
- Protección del elemento de eliminación con
if (Test-Path $file -PathType Leaf)
- Protección del elemento de eliminación con
if ([IO.File]::Exists($file.FullName) -ne $true)
Ninguno de estos parece funcionar, ¿y si la forma recomendada de evitar que se ingrese un bucle foreach si la lista está vacía?
powershell
SteB
fuente
fuente
Respuestas:
Con Powershell 3, la
foreach
declaración no se repite$null
y el problema descrito por OP ya no se produce.Desde la publicación del blog de Windows PowerShell Nuevas características del lenguaje V3 :
Para PowerShell,
$PSVersionTable.PSVersion.Major -le 2
consulte lo siguiente para obtener la respuesta original.Tienes dos opciones, yo uso principalmente la segunda.
Comprueba
$backups
si no$null
. Una simpleIf
vuelta al circuito puede verificar si no$null
O
Inicializar
$backups
como una matriz nula. Esto evita la ambigüedad del problema "iterar matriz vacía" sobre el que preguntó en su última pregunta .Lo sentimos, no proporcioné un ejemplo que integre su código. Tenga en cuenta el
Get-ChildItem
cmdlet envuelto en la matriz. Esto también funcionaría con funciones que podrían devolver a$null
.fuente
Sé que esta es una publicación anterior, pero me gustaría señalar que el cmdlet ForEach-Object no sufre el mismo problema que el uso de la palabra clave ForEach. Por lo tanto, puede canalizar los resultados de DIR a ForEach y simplemente hacer referencia al archivo usando $ _, como:
En realidad, puede reenviar el comando Dir a través de la tubería y evitar incluso asignar la variable como:
Agregué saltos de línea para facilitar la lectura.
Entiendo que algunas personas les gusta ForEach / In para facilitar la lectura. A veces, ForEach-object puede ponerse un poco peludo, especialmente si está anidando ya que es difícil seguir la referencia $ _. En cualquier caso, para una operación pequeña como esta es perfecta. Muchas personas también afirman que es más rápido, sin embargo, he descubierto que es solo un poco.
fuente
foreach
declaración ya no entra$null
, por lo que el error descrito por OP ya no se produce. Consulte la sección "La declaración ForEach no itera sobre $ null" en la publicación del blog Powershell Nuevas características del lenguaje V3 .Desarrollé una solución ejecutando la consulta dos veces, una para obtener los archivos y otra para contar los archivos mediante la conversión de get-ChilItem para devolver una matriz (convertir $ backups como una matriz después de que el hecho no parece funcionar) .
Al menos funciona como se esperaba (el rendimiento no debería ser tan problemático ya que nunca habrá más de una docena de archivos), si alguien conoce una solución de consulta única, publíquela.
fuente
Use lo siguiente para evaluar si la matriz tiene algún contenido:
Si la variable no existe, Powershell simplemente la evaluará como falsa, por lo que no es necesario verificar si existe.
fuente