在 PowerShell 中,我输入以下语句:
$var = Get-WmiObject win32_product | select-object name
if ($var.name -like 'adobe') {write-host '123'}
该变量可以很好地存储已安装产品的列表;但是,我的if
then 不会捕获任何东西。在执行时,我没有得到任何输出或错误。如果我使用诸如Get-Process 之类的东西,但不适用于Get-WmiObject ,则此方法有效。
在 PowerShell 中,我输入以下语句:
$var = Get-WmiObject win32_product | select-object name
if ($var.name -like 'adobe') {write-host '123'}
该变量可以很好地存储已安装产品的列表;但是,我的if
then 不会捕获任何东西。在执行时,我没有得到任何输出或错误。如果我使用诸如Get-Process 之类的东西,但不适用于Get-WmiObject ,则此方法有效。
该-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 块。
另一个答案是最好让 WMI 在服务器上进行过滤,这样您的网络流量就会减少。这是一个带有 WMI 过滤器的示例:
Get-WmiObject win32_Product -Filter "name like '%adobe%'"
我从来没有意识到有一个类似的比较运算符?在那种情况下,我通常使用 .Contains("value looking for") 。
但是,刚刚注意到这里有一个 -contains 运算符。
啊,如果你得到一个以上的结果,你需要遍历它们:
$var | foreach-object { if ( $_.name -contains 'adobe' ) { write-host '123' } }
可能是这样的吗?
$var 是结果列表,它没有属性“名称”,但列表中的每个项目都应该。
要添加到@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'
$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'}