2010-01-05 10 views

Répondre

15

données:

-- begin exclusions.txt -- 
a.txt 
b.txt 
c.txt 
-- end -- 

code:

# read all exclusions into a string array 
$exclusions = Get-Content .\exclusions.txt 

dir -rec *.* | Where-Object { 
    $exclusions -notcontains $_.name } | ` 
    Remove-Item -WhatIf 

Retirez le commutateur -WhatIf si vous êtes satisfait de vos résultats. -WhatIf vous montre ce qu'il serait do (il ne supprimera pas)

-Oisin

+3

Je l'aime. Pourquoi ne pas utiliser -notcontains, cependant? –

+0

Merci. Cela fonctionne parfaitement pour moi. J'ai essayé avec -notcontains comme Mike suggéré et les résultats sont les mêmes. – Mrchief

+0

Je déteste -notcontains. Non, je plaisante. oui, c'est toujours terser. – x0n

7

Si les fichiers existent dans le dossier en cours, vous pouvez le faire:

Get-ChildItem -exclude (gc exclusions.txt) | Remove-Item -whatif 

Cette approche suppose chaque fichier est sur une ligne distincte. Si les fichiers existent dans les sous-dossiers, alors j'irais avec l'approche d'Oisin.

+0

Oui, les fichiers sont sur des lignes séparées. Merci pour les réponses. Si l'emplacement parent a des sous-dossiers, je reçois une invite disant "L'élément de Microsoft.PowerShell.Core \ FileSystem :: <> a des enfants et le paramètre Recurse n'a pas été spécifié.Si vous continuez, tous les enfants seront supprimés avec le item Êtes-vous sûr de vouloir continuer? " Ajouter probablement le commutateur -recurse le réparera. L'approche d'Oisin ne provoque pas cette invite. – Mrchief

+3

Si des sous-répertoires sont impliqués, alors vous ne voulez pas utiliser mon approche et vous ne voulez pas utiliser -r sinon cela va supprimer des dossiers entiers. –

1

fait cela ne semble travailler pour le premier répertoire plutôt que récursion - mon script modifié récursif correctement.

$exclusions = Get-Content .\exclusions.txt 

dir -rec | where-object {-not($exclusions -contains [io.path]::GetFileName($_))} | ` 
where-object {-not($_ -is [system.IO.directoryInfo])} | remove-item -whatif 
+0

J'ai utilisé $ _. FullName.ToLower() au lieu de [io.path] :: GetFileName ($ _) et utilisé les noms de chemins complets dans ma liste d'exclusion pour que la récursivité fonctionne. – toxaq