2

在 PowerShell 中,我输入以下语句:

$var = Get-WmiObject win32_product | select-object name

if ($var.name -like 'adobe') {write-host '123'}

该变量可以很好地存储已安装产品的列表;但是,我的ifthen 不会捕获任何东西。在执行时,我没有得到任何输出或错误。如果我使用诸如Get-Process 之类的东西,但不适用于Get-WmiObject ,则此方法有效。

4

5 回答 5

1

-like运算符是通配符模式匹配运算符。它返回与您提供的表达式匹配的内容。用作*通配符。所以你会使用:

if ($var.name -like '*adobe*') {write-host '123'}

更新- 像这样访问集合上的 name 属性仅在 PowerShell v3 中对我有用。对于 PowerShell v2,我认为您需要做一些不同的事情。我建议创建一个字符串数组而不是像这样的 PsCustomObjects 集合(-ExpandProperty参数起作用):

$var = get-wmiobject win32_product | ? {$_.Name} | select-object -Expand name

然后在不使用 name 属性的情况下执行 if 语句:

if ($var -like '*adobe*') {write-host '123'}

如果您在名称中安装了带有 adobe 的东西,它将执行 IF 块。

于 2012-05-19T04:52:10.263 回答
1

另一个答案是最好让 WMI 在服务器上进行过滤,这样您的网络流量就会减少。这是一个带有 WMI 过滤器的示例:

Get-WmiObject win32_Product -Filter "name like '%adobe%'"
于 2012-05-19T12:32:05.223 回答
0

我从来没有意识到有一个类似的比较运算符?在那种情况下,我通常使用 .Contains("value looking for") 。

但是,刚刚注意到这里有一个 -contains 运算符。

掌握 PowerShell,第 7 章条件

啊,如果你得到一个以上的结果,你需要遍历它们:

$var | foreach-object { if ( $_.name -contains 'adobe' ) { write-host '123' } }

可能是这样的吗?

$var 是结果列表,它没有属性“名称”,但列表中的每个项目都应该。

于 2012-05-18T22:45:55.117 回答
0

要添加到@Zach 的答案,就像您所说的那样:

$var.name -like 'adobe'

只有当他的名字完全等于“abobe”时才会匹配。

例如

PS C:\> 'adobe' -like 'adobe'
True
PS C:\> 'Adobe Air' -like 'adobe'
False

但是, -like 旨在与通配符一起使用:

PS C:\> 'Adobe Air' -like '*adobe*'
True

所以你可以做

$var | foreach{ if ( $_.name -like '*adobe*' ) { write-host '123' } }

或者,在更 POSH 风格中,使用 where-object

$var | where-object{ $_.name -like '*adobe*' } |  write-host '123'
于 2012-05-19T05:10:10.470 回答
0

$var.name仅在$var包含单个对象(标量,单例)时有效。当$var持有一个项目集合时,PowerShell 会尝试为您获取集合本身的 Name 属性。

集合/数组没有 Name 属性,你什么也得不到。也就是说,$var.Name将在 PowerShell v3 中工作。

要与 Name 属性进行比较,您需要遍历所有对象并且:

if ($var.name -like 'adobe') {write-host '123'}

如果您提取了所有值($var包含字符串列表),那么您可以这样做:

$var = get-wmiobject win32_product | select-object -expand name

if ($var -like 'adobe') {write-host '123'}
于 2012-05-19T09:38:49.900 回答