Powershell 使用变量在Get命令上启用筛选

Powershell 使用变量在Get命令上启用筛选,powershell,where-clause,Powershell,Where Clause,试图制作一个脚本,为我运行的查询提供一些选项。我希望能够不时禁用get WMIOObject中的“Where{}”过滤器。但是不能在表达式中使用变量…因此这不起作用:: gwmi -class win32_product | $whereEnabled | select name, version 您是否可以启用/禁用“Where”过滤器,而不只是生成另一个表达式并使用if/else循环 以下是请求的完整Get表达式: get-wmiobject -class win32_product -c

试图制作一个脚本,为我运行的查询提供一些选项。我希望能够不时禁用get WMIOObject中的“Where{}”过滤器。但是不能在表达式中使用变量…因此这不起作用::

gwmi -class win32_product | $whereEnabled | select name, version
您是否可以启用/禁用“Where”过滤器,而不只是生成另一个表达式并使用if/else循环

以下是请求的完整Get表达式:

get-wmiobject -class win32_product -computer $PC | where {$ignore -notcontains $_.IdentifyingNumber} | Select IdentifyingNumber, Name | sort-object IdentifyingNumber | export-csv -Delimiter `t -NoTypeInformation -Append -encoding "unicode" -path $logfile

$ignore是一个文本文件,通过识别号码,在我们的设备上包含已知的必需应用程序。时不时地,我需要获取所有应用程序的列表,并希望“禁用”表达式的这一部分。

我脑海中唯一想到的是这样的东西,这只是一个想法:

 [scriptblock]$w = {  $_.caption -match 'micro' }

gwmi -class win32_product | ? $w | select caption
可以按如下方式更改脚本块:

 [scriptblock]$w = {  $true } #edited after @mjolinor comment
get-wmiobject -class win32_product -computer $PC | where { ($whereEnabled -and $ignore -notcontains $_.IdentifyingNumber) -or !$whereEnabled } | Select IdentifyingNumber, Name | sort-object IdentifyingNumber | export-csv -Delimiter `t -NoTypeInformation -Append -encoding "unicode" -path $logfile
要模拟非where对象过滤器,请将管道的where部分更改为:

where { ($whereEnabled -and $ignore -notcontains $_.IdentifyingNumber) -or !$whereEnabled }
因此,您的整个命令如下所示:

 [scriptblock]$w = {  $true } #edited after @mjolinor comment
get-wmiobject -class win32_product -computer $PC | where { ($whereEnabled -and $ignore -notcontains $_.IdentifyingNumber) -or !$whereEnabled } | Select IdentifyingNumber, Name | sort-object IdentifyingNumber | export-csv -Delimiter `t -NoTypeInformation -Append -encoding "unicode" -path $logfile

如果$whereEnabled为true,它将进行检查,否则不会进行检查。

您也可以使用过滤器。像这样:

filter whereEnabled {
    param($list)

    if ($list -notcontains $_.IdentifyingNumber) {
        $_
    }
}

# If $ignore is already loaded from file
gwmi -class win32_product | whereEnabled $ignore | select name, version

# Or
gwmi -class win32_product | whereEnabled (Get-Content c:\myignorelist.txt) | select name, version

如果文件为空/$ignore为null,则它不会过滤掉任何内容。

这是可能的,但在不知道其余代码的情况下很难向您展示如何实现它。您试图返回哪些属性>{$true}会更简单吗?这对powershell来说并不陌生,所以脚本块让我很困惑。这是我的脚本块,还是一个明确的命令?是where对象的别名,例如where也是。它接受一个scriptblock作为{}内部代码的过滤器好吧,这对我来说是有意义的…它成功了!没有考虑将$true括在括号中作为逻辑变量传递。谢谢是否设置了$whereEnabled=$true?是,已验证。它根本没有将忽略列表与$true或$false一起使用。我不知道接下来会发生什么。我没有powershell v3,因此无法测试您的确切命令,但它似乎可以使用类似的命令。也许可以尝试在$ignore-notcontains$周围添加另一组括号。C.B.的建议奏效了。谢谢你的帮助,斯坦利