Powershell v1 - удаление всех файлов и папок, кроме названной папки - PullRequest
2 голосов
/ 12 февраля 2010

Я хочу удалить все содержимое и дочерние элементы данной корневой папки, однако я хочу сохранить некоторые файлы (журналы), которые все находятся в папке журналов Каков элегантный способ сделать это в PowerShell. В настоящее время я делаю это в несколько этапов, конечно, это можно сделать легко ... У меня такое ощущение, что мой односторонний / языковой уклон мешает

например
C: \ Temp
C: \ Temp \ журналы
C: \ Temp \ Logs \ mylog.txt
C: \ Temp \ Logs \ myotherlog.log
C: \ Temp \ filea.txt
C: \ Temp \ fileb.txt
C: \ Temp \ folderA ...
c: \ temp \ folderB ...

после удаления должно быть просто
C: \ Temp
C: \ Temp \ журналы
C: \ Temp \ Logs \ mylog.txt
c: \ temp \ logs \ myotherlog.log

это должно быть просто; я думаю, что 12:47 утра - меня заводит ...

Заранее спасибо

RhysC

Ответы [ 2 ]

9 голосов
/ 13 февраля 2010

dir c: \ temp | где {$ _. name -ne 'logs'} | Remove-Item -Recurse -force

2 голосов
/ 12 февраля 2010

Вот общее решение:

function CleanDir($dir, $skipDir) {
    write-host start $dir
    Get-ChildItem $dir | 
        ? { $_.PsIsContainer -and $_.FullName -ne $skipDir } | 
        % { CleanDir $_.FullName $skipDir } |
        ? { $skipDir.IndexOf($_, [System.StringComparison]::OrdinalIgnoreCase) -lt 0 } |
        % { Remove-Item -Path $_ }
    Get-ChildItem $dir |
        ? { !$_.PsIsContainer } |
        Remove-Item
    $dir
}

CleanDir -dir c:\temp\delete -skip C:\temp\delete\logs

Работает рекурсивно. Первый параметр CleanDir - это начальный каталог. Второй ($skipDir) - это каталог, который не следует удалять (и его содержимое также не должно быть).

Отредактировано: исправлен запутанный пример;)

...