2009-02-20 9 views
3

Что является самым компактным способом удаления всех файлов из папки кроме одного файла в сценарии PowerShell. Я не имею никакого значения, какой файл хранится, до тех пор, пока он хранится.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 

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

+0

У меня нет проблемы, как таковой с -noMatch чеком. Я думаю, что более PS-способ будет там, где {-not $ _. PSIsContainer} – EBGreen

ответ

9

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

реж | где {. $ Режим _ -notmatch "d"} | выберите -skip 1 | дель

+0

Добро пожаловать в SO, Джеффри. –

+1

Похоже, это отличный репозиторий для формализованного фольклора. –

0

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

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

+0

Я думаю, что это приведет к тому, что папка будет более поздней, чем все файлы. – EBGreen

+0

Хммм. Он должен был оставить один файл. Папки/подпапки должны оставаться нетронутыми. – BuddyJoe

1

как насчет:

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

удаляет все, но последний.

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

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

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

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

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

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

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

function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];} 
dir $dirName | where {isNotDir($_)} 
+0

Как вы можете указать путь и сделать его одной строкой кода? – BuddyJoe

+0

помните, что этот файл также удалит папки. – EBGreen

+0

Я отредактировал это с более гибким решением, которое позволит вам пропускать папки. – zdan

4

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

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

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

gci $dirName | skip-count 1 | del 

Источник Пропустить-Count: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx

EDIT

Для того, чтобы убить папки используйте «гт -re - Fo»вместо "дель"

edit2

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

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

г. Член PsIsContainer верно только для папок.

+0

Это все равно будет убивать папки? – EBGreen

+0

@EBGreen, нет, но я добавил Edit, чтобы указать, как заставить его убивать папки. – JaredPar

+0

JaredPar, что именно препятствует удалению папок? Посмотрите мои последние комментарии на ответ zdans. – BuddyJoe

1

Мой любимый:

move file to preserve elsewhere 
delete all files 
move preserved file back 

 Смежные вопросы

  • Нет связанных вопросов^_^