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プロパティにアクセスすることは、PowerShellv3でのみ機能しました。PowerShell v2の場合は、少し異なる方法で行う必要があると思います。このようなPsCustomObjectsのコレクションの代わりに文字列配列を作成することをお勧めします(-ExpandPropertyparamが機能します):

$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

もう 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 は結果リストで、プロパティ「name」はありませんが、リスト内の各項目は必要です。

于 2012-05-18T22:45:55.117 に答える
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 に答える
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 に答える