$objShell = New-Object -Com Shell.Application
$objFolder = $objShell.Namespace(0xA)
Remove-Item ($objFolder.items() | select path | where-object { $_.path -like "C:\*" }).path -Recurse -Confirm:$false
Я хочу взять только путь с C: \ и удалить его из корзины. Но я хочу сделать это без использования {}. как вы будете знать, где объект нуждается в фигурных скобках. если есть другой способ, пожалуйста, дайте мне знать.
Я использую powershell версии 4 и предпочитаю код только для более низких версий. Заранее спасибо.
Спасибо за быстрый ответ. но я получаю эту ошибку. Невозможно преобразовать значение "пути" типа 'System.String' в тип "System.Management.Automation.ScriptBlock"
@SivaThilak: Совет С.Дева должен работать в PSv3 +. Ваше сообщение об ошибке предполагает, что вы используете v2, а не v4.
Совет для пользователей PSv5 +: Clear-RecycleBin -Drive C:
В PowerShell 4.0 Where-Object
поддерживает синтаксис на основе параметров, поэтому фигурные скобки не нужны.
Поскольку объекты, возвращаемые $RecBin.Items()
, уже имеют свойство Path
, вы можете передать их напрямую в Remove-Item
:
$RecBin.Items() |Where-Object Path -like "C:\*" |Remove-Item -Recurse -Confirm:$false
Полезный ответ Матиаса Р. Джессена напрямую отвечает на ваш вопрос, демонстрируя упрощенный синтаксис Where-Object
(функция PSv3 +, известная как сравнительное заявление).
Однако в вашем случае вы можете полностью обойти Where-Object
и применить оператор -like
непосредственно к (преобразованному) перечислению элементов, возвращаемых $objFolder.items()
:
Использование синтаксиса PSv2 +:
Remove-Item (
@($objFolder.items() | Select-Object -ExpandProperty Path) -like 'C:\*'
) -Recurse -Confirm:$false
Обратите внимание, что использование @()
гарантирует, что -like
действует на LHS со значением множество и, следовательно, действует как элемент фильтр.
-ExpandProperty
гарантирует, что возвращается свойство .Path
значения, а не настраиваемые объекты со свойством .Path
.
В PSv3 + вы можете упростить и ускорить команду, используя перечисление членов, что означает доступ к свойству на уровне коллекция, чтобы вернуть значения свойства элементы ' коллекции:
Remove-Item (
@(@($objFolder.items()).Path) -like 'C:\*'
) -Recurse -Confirm:$false
Обратите внимание, что внутренний @(...)
вокруг $objFolder.items()
необходим только потому, что $objFolder
является объектом COM, свойства которого не похожи на обычные коллекции .NET в PowerShell; @(...)
в этом случае принудительно выполняет перечисление.
Where-Object path -like "C:\*"
работает.