如何 运行 这个没有大括号的 powershell 命令{}

how to run this powershell command without curly braces{}

$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,我更喜欢低版本的代码。 提前致谢。

在 PowerShell 4.0 中,Where-Object 支持基于参数的语法,因此您不需要大括号。

由于 $RecBin.Items() 返回的对象已经有一个 Path 属性,您可以将它们直接传递给 Remove-Item:

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

directly answers your question by demonstrating simplified Where-Object syntax (a PSv3+ feature known as a comparison statement).

但是,在您的情况下,您可以完全绕过 Where-Object,并将 -like 运算符直接应用于 return 由 $objFolder.items() 编辑的(转换后的)项目枚举:

使用 PSv2+ 语法:

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

请注意,使用 @() 可确保 -like 作用于 数组 值 LHS,因此充当元素 过滤器.

-ExpandProperty 确保 .Path 属性 是 returned 而不是带有 [=19= 的自定义对象] 属性.


PSv3+中你可以通过使用成员访问枚举来简化和加速命令,这意味着访问一个属性 在 集合 级别,以便 return 集合 元素' 属性 值:

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

请注意,$objFolder.items() 周围的内部 @(...) 是必要的,因为 $objFolder 是一个 COM 对象,其属性不表现得像 PowerShell 中的常规 .NET 集合; @(...) 在这种情况下强制枚举。