Скрипт Powershell для удаления файлов, не указанных в списке - PullRequest
11 голосов
/ 06 января 2010

У меня есть список имен файлов в текстовом файле, например:

f1.txt
f2
f3.jpg

Как мне удалить все остальное из папки, кроме этих файлов в Powershell?

Псевдо-код:

  • Читать текстовый файл построчно
  • Создать список имен файлов
  • Папка Recurse и ее подпапки
  • Если имени файла нет в списке, удалите его.

Ответы [ 3 ]

16 голосов
/ 06 января 2010

Данные:

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

Код:

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

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

Снимите переключатель -WhatIf, если вас устраивают ваши результаты. -WhatIf показывает, что он будет делать (то есть он не будет удалять)

-Oisin

6 голосов
/ 06 января 2010

Если файлы существуют в текущей папке, вы можете сделать это:

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

Этот подход предполагает, что каждый файл находится на отдельной строке. Если файлы существуют в подпапках, я бы использовал подход Ойсина.

1 голос
/ 03 марта 2010

на самом деле, похоже, это работает только для первого каталога, а не для рекурсии - мой измененный скрипт рекурсивно работает.

$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
...