2010-04-24 5 views
10

Je souhaite nettoyer certains répertoires après l'exécution de mon script en supprimant certains dossiers et fichiers du répertoire en cours s'ils existent. A l'origine, je structuré le script comme ceci:Nettoyage de dossier avec PowerShell

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

Maintenant que j'ai tout à fait quelques éléments énumérés dans cette section, je voudrais nettoyer le code. Comment puis-je le faire?

Remarque: Les éléments sont nettoyés avant le script s'exécute, car ils sont restés de la précédente exécution au cas où j'ai besoin de les examiner.

Répondre

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

Vous pouvez directement rediriger 'Remove-Item' en supprimant' $ _'. –

+1

Bon point (pour l'entrée de liaison au paramètre -Path). En fait, j'utilise généralement -LiteralPath autant que possible (moins sujet aux erreurs), donc j'ai proposé cette version en gardant toujours -LiteralPath à l'esprit. –

+0

Excellent extrait, j'ai eu du mal avec "Erreur: répertoire n'est pas vide" pour plus de temps que je voudrais admettre. –

0

Une possibilité

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

Je préfère ne pas avoir ignoré les erreurs car ils sont assez facilement évités ici. :) –

+0

D'accord, il ne convient pas à votre scénario, car vous devriez connaître les problèmes avant que le script continue. Encore, cette version fera dans d'autres cas, par exemple le nettoyage * après * le travail de 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 
      } 
     } 

Ou, vous pouvez faire deux blocs séparés pour chaque type.

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

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

Il s'avère que 'Remove-Item -r' fonctionne à la fois pour les dossiers et les fichiers. –

+0

@ 280Z28 Cool! Je ne le savais pas. –