1

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

gwmi -class win32_product | $whereEnabled | select name, version

您能否在不创建另一个表达式并使用 if/else 循环的情况下启用/禁用“Where”过滤器?

以下是请求的完整 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 是一个文本文件,其中包含我们设备上已知的必需应用程序(通过识别编号)。时不时地,我需要获取所有应用程序的列表,并希望“禁用”这部分表达式。

4

3 回答 3

0

我唯一想到的是这样的,这只是一个想法:

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

gwmi -class win32_product | ? $w | select caption

您可以像这样更改脚本块:

 [scriptblock]$w = {  $true } #edited after @mjolinor comment

模拟非where-object过滤器。

于 2013-03-18T13:47:10.210 回答
0

where将管道部分更改为:

where { ($whereEnabled -and $ignore -notcontains $_.IdentifyingNumber) -or !$whereEnabled }

这样你的整个命令看起来像这样:

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为真,它将进​​行检查,否则不会。

于 2013-03-18T13:55:04.110 回答
0

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

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为空,则不会过滤掉任何内容。

于 2013-03-18T15:55:09.423 回答