比较2个win32类以获取相关信息

时间:2014-01-21 11:37:22

标签: powershell powershell-v2.0

好的代码非常简单,但我似乎无法提取制造商信息。自从我上次使用PowerShell编写脚本以来已经有一年了,但看起来这样做并不是很困难。

$Var1 = GWMI Win32_PhysicalMedia
$Var2 = GWMI Win32_diskdrive |Select model
ForEach ($Item in $var2) {
    $Item |Select model |Where {$_.deviceID -eq $Var1.tag}
}

3 个答案:

答案 0 :(得分:1)

几点说明:这一点:

$Var2 = GWMI Win32_diskdrive |Select model
ForEach ($Item in $Var2) {
 $Item |Select model |Where {$_.deviceID -eq $Var1.tag}
}

你基本上是这样说:“给我win32_diskdrive的”model“属性,然后你想过滤”deviceId“属性(因为你只选择了模型,你没有这个属性)

另外,你假设$ var1是一个对象,而不是一个对象数组(它很可能是)。如果你想迭代$ var2中的每个项目并将它与$ var1中的每个对象进行比较,看看你是否有匹配,我会在你的循环中放入另一个循环(注意除了搜索数组之外还有其他方法)此):

 $Var1 = GWMI Win32_PhysicalMedia
 $Var2 = GWMI Win32_diskdrive
 #Iterate through each item in $var2
 ForEach ($Item in $Var2) {
     #Iterate through each item in $var1
     foreach ($var1item in $var1)
         {
             #look for a match
             $founditem = $Item |Where {$_.deviceID.tostring() -eq $var1item.tag.tostring()}
             if ($founditem)
                 {
                     #if match, return the object
                     $FoundItem        
                 }

         }

 }

我建议你花点时间通过查看PowerShell返回的对象来调试这些类型的问题.Gettype()和|获得会员。了解使用的对象是理解PowerShell的关键。

答案 1 :(得分:0)

在你的foreach循环中,你正在调用的变量名是$ var2而不是前面使用的$ Var2。我在我的系统上进行了更改并且工作正常。

$Var1 = GWMI Win32_PhysicalMedia
$Var2 = GWMI Win32_diskdrive |Select model
ForEach ($Item in $Var2) {
    $Item |Select model |Where {$_.deviceID -eq $Var1.tag}
}

希望这有帮助!

答案 2 :(得分:0)

也许你想要

$drives = gwmi win32_diskdrive
$media = gwmi Win32_PhysicalMedia
foreach ($d in $drives) { 
  $media | where {$_.tag -eq $d.deviceID} | select <comma-separated list of properties>
}

或只是

gwmi win32_diskdrive | select deviceID, model | ft -auto

或者您正在寻找哪些制造商信息?