$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,我更喜欢只有较低版本的代码。 提前谢谢。
答案 0 :(得分:3)
在PowerShell 4.0中,Where-Object
支持基于参数的语法,因此您不需要大括号。
由于$RecBin.Items()
返回的对象已经具有Path
属性,因此您可以将它们直接传送到Remove-Item
:
$RecBin.Items() |Where-Object Path -like "C:\*" |Remove-Item -Recurse -Confirm:$false
答案 1 :(得分:1)
Mathias R. Jessen's helpful answer通过演示简化的Where-Object
语法(称为comparison statement的PSv3 +功能)来直接回答您的问题。
但是,在您的情况下,您可以完全绕过Where-Object
,并将-like
运算符直接应用于$objFolder.items()
返回的(已转换的)枚举项:
使用 PSv2 + 语法:
Remove-Item (
@($objFolder.items() | Select-Object -ExpandProperty Path) -like 'C:\*'
) -Recurse -Confirm:$false
请注意,使用@()
可确保-like
作用于数组评估的LHS,因此可充当元素过滤器。< / p>
-ExpandProperty
确保返回.Path
属性值而不是具有.Path
属性的自定义对象。
在 PSv3 + 中,您可以使用成员枚举简化和加速命令,这意味着按顺序访问集合级别的属性返回集合 elements'属性值:
Remove-Item (
@(@($objFolder.items()).Path) -like 'C:\*'
) -Recurse -Confirm:$false
请注意,仅@(...)
周围的内部$objFolder.items()
是必需的,因为$objFolder
是 COM 对象,其属性不像常规.NET PowerShell中的集合; @(...)
在这种情况下强制枚举。