2009-04-18 2 views
1

У меня странная вещь, идущая здесь, в Powershell 1.0, и я не понимаю, почему Powershell реагирует так, как она есть.Проблема с Powershell с внутренней логикой

Ситуация: Я создал несколько архивных файлов на диске буквой е:

Теперь я хочу, чтобы удалить их все. Но на моем диске e: есть больше zip-файлов. Поэтому я хочу удалить только те, которые находятся в этой конкретной папке и ее подпапках.

Команда, которую я хочу использовать для этого:

PS E:\> Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Name -Force | Remove-Item -Force 

Однако, при исполнении, я получаю кучу ошибок, затем все говорят, что

Не можете найти пути E: \ тест. zip, потому что его не существует.

В самом деле, нет такого файла, как test.zip непосредственно под й: Оно существует в папке иконок, которые я передал сценарий.

Решение для меня, чтобы изменить каталог в папку значков и выполнить там команду.

Но это не логично. Я хочу быть в состоянии сказать, в каком каталоге файлы должны быть удалены, а затем они должны быть удалены только там. Почему Powershell начинает искать файлы в текущем каталоге, это для меня загадка.

Может кто-нибудь объяснить это мне, пожалуйста?

ответ

8

Если удалить Remove-Item в конце трубопровода вы увидите, что все имена путей, которые возвращаются по отношению к пути введенного через параметр -Path в Get-ChildItem. Итак, Remove-Item просматривает текущий каталог для всех путей Get-ChildItem возвращается.

Как указал капитан, здесь указан параметр -Name. Бросив это гарантирует, что вы получите объекты File, где Remove-Item может найти файл легко:

Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force 

будет работать, как задумано. Не доходите до уровня строки, если вы можете что-то решить с объектами :-)

+0

+1, Это действительно работает, и проще, чем мое решение –

+0

спасибо, что сделал трюк. Странно, как этот специфический параметр влияет на результат. – KdgDev

+2

Ну, параметр сообщает командлету возвращать строки вместо объектов FileInfo. Remove-Item достаточно умен, чтобы узнать, что удалить при получении FileInfo, но со строками он может принимать только путь ...и поскольку они относятся к указанному вами пути ... он может только догадываться. Параметр -Name, вероятно, доступен только для показа; Однако использование объектов намного проще в конвейере. – Joey

3

Get-ChildItem, кажется, возвращает часть пути, следуя пути поиска, а также имя файла при использовании -Name. Это имя файла затем отправляется в Remove-Item, который использует текущий каталог и возвращает имя файла.

Я пробовал эту команду с использованием -FullName, но это, похоже, не работает, поэтому вы должны иметь возможность передать эту команду в Select-Object, чтобы указать полное имя и канал в Remove-Item.

Try:

Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse | 
Select-Object -Property FullName | Remove-Item -Force 
Смежные вопросы