2011-07-28 6 views
24

Estoy perplejo aquí en lo que parece ser un problema simple; lo siento por cualquier cabeza hueca aquí.¿Cómo se puede probar Get-ChildItem sin resultados (cero archivos)?

Tengo una secuencia de comandos que limpia los archivos de copia de seguridad desaparecidos. Después de identificar los archivos, repito e imprimo lo que se está volcando. Mi problema surge al tratar de proporcionar comentarios/pruebas cuando hay cero archivos difuntos. La secuencia de comandos se parece a ...

$Files = Get-ChildItem $BackupPath_Root -include *.bak -recurse 
      | where {$_.CreationTime -le $DelDate_Backup } 

if ($Files -eq "" -or $Files.Count -eq 0) { 
    write-host " no files to delete." #<-- this doesn't print when no files 
} else { 
    foreach ($File in $Files) { 
     write-host “$File” 
     Remove-Item $File | out-null 
    } 
} 

Si no se comprueba la ausencia de archivo, si no se comprueba ningún archivo. ¿Cuál es la forma adecuada de probar $Files sin resultados?

Respuesta

43

Intenta envolver en @(..). Siempre crea una matriz:

$Files = @(Get-ChildItem $BackupPath_Root -include *.bak -recurse 
      | where {$_.CreationTime -le $DelDate_Backup }) 
if ($Files.length -eq 0) { 
    write-host " no files to delete." 
} else { 
    .. 
} 
+1

Este es un gran truco para el manejo conjunto PowerShell peculiar/interpretación. ¡Gracias! –

+0

Se ha subido porque, en mi opinión, es la forma correcta (y fácil) de manejar arreglos que podrían ser nulos o donde la siguiente tubería fallará si es nula. – CosmosKey

4

Pruebe también $ archivos -eq $ null.

12

Cuando no hay archivos, archivos $ es igual a $ nula, por lo que sugiere EBGreen debe probar contra $ nula. Además, $ Files.Count solo es útil cuando el resultado es una colección de archivos. Si el resultado es un escalar (un objeto), no tendrá una propiedad de conteo y la comparación falla.

Consejo de rendimiento: cuando necesite buscar solo un tipo de extensión, utilice el parámetro -Filtro (en lugar de -Incluir) ya que se está filtrando en el nivel del proveedor.

+1

+1 para la punta del filtro, pero simplifiqué mi ejemplo y el filtro no parece funcionar para la extensión múltiple (* .bak y * .tran) de la forma include does :-( – EBarr

+0

Tengo que dudar esta respuesta como 'if ($ Files = $ null) 'no devuelve true pero' if (! $ Files) 'hace. – Marc

+0

Lo sentimos, aparentemente puedes probar' if ($ Files -eq $ null) 'or' if (! $ Files) ' pero no, por alguna razón, 'if ($ Files = $ null)'. – Marc

7

La variable se evalúa como una expresión de valor nulo cuando la carpeta escaneada está vacía. Se puede utilizar:

if (!$Files) { 
# ... 
} 
+0

¿quiere decir si (! $ Files) {/ no escribe ningún archivo aquí /}? – EBarr

+0

Oh sí, no leí el siguiente código :)) Gracias –

+2

¿Por qué no es esta la respuesta aceptada? –

0

Especificación de la [BOOL] escribir en frente de un comando Get-childitem devolverá True si se encuentra cualquier cosa, o falso si no se encuentra nada. Esto es lo que está haciendo la respuesta de Emiliano, pero sin el requisito negativo. Puedes hacer cualquiera de los dos trabajos, pero prefiero [bool] con algunos de los enunciados condicionales más complejos solo para que sea más fácil de seguir.

[bool](Get-ChildItem C:\foo.txt) 

utiliza en una sentencia Si

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"} 
Cuestiones relacionadas