如何在没有花括号的情况下运行此powershell命令{}

时间:2018-05-01 23:14:55

标签: powershell recycle-bin

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 :(得分: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中的集合; @(...)在这种情况下强制枚举。