2010-04-24 25 views
10

Me gustaría limpiar algunos directorios después de que mi script se ejecute eliminando ciertas carpetas y archivos del directorio actual, si es que existen. En un principio, el guión estructurado así:Limpieza de carpetas con PowerShell

if (Test-Path Folder1) { 
    Remove-Item -r Folder1 
} 
if (Test-Path Folder2) { 
    Remove-Item -r Folder2 
} 
if (Test-Path File1) { 
    Remove-Item File1 
} 

Ahora que tengo un buen número de elementos que se enumeran en esta sección, me gustaría limpiar el código. ¿Como lo puedo hacer?

Nota al margen: Los elementos se limpian antes de se ejecuta el script, ya que quedan de la ejecución anterior en caso de que necesite examinarlos.

Respuesta

11
# if you want to avoid errors on missed paths 
# (because even ignored errors are added to $Error) 
# (or you want to -ErrorAction Stop if an item is not removed) 
@(
    'Directory1' 
    'Directory2' 
    'File1' 
) | 
Where-Object { Test-Path $_ } | 
ForEach-Object { Remove-Item $_ -Recurse -Force -ErrorAction Stop } 
+1

Puede canalizar directamente a 'Remove-Item' dejando caer' $ _'. –

+1

Buen punto (para vincular la entrada al parámetro -Path). De hecho, suelo utilizar -LiteralPath tanto como sea posible (menos propenso a errores), por lo que propuse que esta versión siga teniendo en mente -LiteralPath. –

+0

Fragmento excelente, he estado luchando con "Error: el directorio no está vacío" durante más tiempo del que me gustaría admitir. –

0

Una posibilidad

function ql {$args} 

ql Folder1 Folder2 Folder3 File3 | 
    ForEach { 
     if(Test-Path $_) { 
      Remove-Item $_ 
     } 
    } 
0
# if you do not mind to have a few ignored errors 
Remove-Item -Recurse -Force -ErrorAction 0 @(
    'Directory1' 
    'Directory2' 
    'File1' 
) 
+0

Prefiero no han ignorado los errores, ya que están muy fácilmente evitados aquí. :) –

+0

De acuerdo, no es adecuado para su escenario porque debe conocer los problemas antes de que el script continúe. Aún así, esta versión funcionará en algunos otros casos, por ejemplo, limpieza * después * de que funcione el script. –

1
Folder1, Folder2, File1, Folder3 | 
    ?{ test-path $_ } | 
     %{ 
      if ($_.PSIsContainer) { 
       rm -rec $_ # For directories, do the delete recursively 
      } else { 
       rm $_ # for files, just delete the item 
      } 
     } 

O bien, puede hacer dos bloques separados para cada tipo.

Folder1, Folder2, File1, Folder3 | 
    ?{ test-path $_ } | 
     ?{ $_.PSIsContainer } | 
      rm -rec 

Folder1, Folder2, File1, Folder3 | 
    ?{ test-path $_ } | 
     ?{ -not ($_.PSIsContainer) } | 
      rm 
+1

Resulta que 'Remove-Item -r' funciona para carpetas y archivos. –

+0

@ 280Z28 ¡Genial! No lo sabía. –