как запустить эту команду powershell без фигурных скобок {} - PullRequest
0 голосов
/ 02 мая 2018

enter image description here

$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 и предпочитаю код только для более низких версий. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Полезный ответ Матиаса Р. Джессена прямо отвечает на ваш вопрос, демонстрируя упрощенный синтаксис Where-Object (функция PSv3 +, известная как оператор сравнения ).

Однако в вашем случае вы можете вообще обойти Where-Object и применить оператор -like непосредственно к (преобразованному) перечислению элементов, возвращаемых $objFolder.items():

Использование синтаксиса PSv2 + :

Remove-Item (
   @($objFolder.items() | Select-Object -ExpandProperty Path) -like 'C:\*'
 ) -Recurse -Confirm:$false

Обратите внимание, что использование @() гарантирует, что -like действует на массив -значной LHS и, следовательно, действует как элемент filter .

-ExpandProperty обеспечивает возвращение .Path свойства значений вместо пользовательских объектов со свойством .Path.


В PSv3 + вы можете упростить и ускорить выполнение команды, используя перечисление члена , что означает доступ к свойству на уровне collection для возврата коллекция элементы ' значения свойств:

Remove-Item (
   @(@($objFolder.items()).Path) -like 'C:\*'
 ) -Recurse -Confirm:$false

Обратите внимание, что внутренний @(...), около $objFolder.items(), необходим только потому, что $objFolder является COM объектом, свойства которого не ведут себя как обычные .NET-коллекции в PowerShell; @(...) вызывает перечисление в этом случае.

0 голосов
/ 02 мая 2018

В PowerShell 4.0 Where-Object поддерживает синтаксис на основе параметров, поэтому вам не нужны фигурные скобки.

Поскольку объекты, возвращаемые $RecBin.Items(), уже имеют свойство Path, вы можете направить их напрямую в Remove-Item:

$RecBin.Items() |Where-Object Path -like "C:\*" |Remove-Item -Recurse -Confirm:$false
...