Проблема Powershell с внутренней логикой - PullRequest
1 голос
/ 18 апреля 2009

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

Ситуация: я создал несколько zip-файлов на диске с буквой e:

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

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

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

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

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

Действительно, такого файла, как test.zip, нет непосредственно под e: Он существует в папке значков, которую я передал сценарию.

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

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

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

Ответы [ 2 ]

8 голосов
/ 18 апреля 2009

Если вы удалите 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

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

3 голосов
/ 18 апреля 2009

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

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

Попытка:

    Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse | 
Select-Object -Property FullName | Remove-Item -Force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...