PowerShell - самый компактный способ «удалить все файлы из этой папки, кроме одного» - PullRequest
3 голосов
/ 20 февраля 2009

Какой самый компактный способ удаления всех файлов из папки , за исключением одного файла в скрипте PowerShell. Мне совершенно не важно, какой файл хранится, если только он хранится.

Я использую PowerShell 2 CTP.

UPDATE:
Объединение всех ответов до сих пор ...

$fp = "\\SomeServer\SomeShare\SomeFolder"
gci $fp |where {$_.mode -notmatch "d"} |sort creationtime -desc |select -last ((@(gci $fp)).Length - 1) |del 

Кто-нибудь видел какие-либо проблемы с использованием этого? Как насчет части несоответствия?

Ответы [ 5 ]

9 голосов
/ 21 февраля 2009

В PS V2 мы добавили -SKIP для выбора, чтобы вы могли сделать:

dir | где {$ _. mode -notmatch "d"} | select -skip 1 | del

4 голосов
/ 20 февраля 2009

Без каких-либо встроенных функций это немного запутанно, потому что функции должны иметь дело с определенной длиной. Но вы можете сделать это следующим образом: дважды просмотреть каталог

gci $dirName | select -last ((@(gci $dirName)).Length-1) | del

Я написал несколько расширений PowerShell, которые значительно облегчают выполнение подобных задач. Одним из примеров является Skip-Count, который позволяет пропускать произвольное количество элементов в конвейере. Таким образом, код можно быстро найти, чтобы просмотреть каталог только один раз

gci $dirName | skip-count 1 | del

Источник для подсчета пропусков: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx

EDIT

Чтобы убить папки, используйте "rm -re -fo" вместо "del"

EDIT2

Чтобы избежать всех папок (пустых или нет), вы можете изменить код как таковой

gci $dirName | ?{ -not $_.PSIsContainer } | skip-count 1 | del

Член PSISContainer имеет значение true только для папок.

1 голос
/ 21 февраля 2009

Мой любимый:

move file to preserve elsewhere
delete all files
move preserved file back
1 голос
/ 20 февраля 2009

как насчет:

dir $dirName | select -first ((dir $dirName).Length -1) | del

удаляет все, кроме последнего.

Редактировать: Более гибкая версия, плюс вам не нужно будет вводить команду dir дважды:

$include=$False; dir $dirNam | where {$include; $include=$True;} | del

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

$include=$False; dir $dirNam | where {$include -and $_.GetType() -ne [System.IO.DirectoryInfo]; $include=$True;} | del

Редактировать 2 в отношении исключения каталогов с использованием свойства Mode. Я думаю, это должно работать при условии, что фреймворк не меняет способ генерации строки режима (я не могу себе представить, что это будет). Хотя я мог бы сжать регулярное выражение до:

$_.Mode -notmatch "^d.{4}"

Если вы пытаетесь не печатать, лучше всего добавить функцию в свой профиль:

function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];}
dir $dirName | where {isNotDir($_)}
0 голосов
/ 20 февраля 2009

del . -Exclude (dir | sort creationtime -desc) [0] -whatif

Это удалит все файлы, кроме самого последнего созданного.

...