Powershell多维关联表

时间:2015-02-18 03:41:47

标签: powershell multidimensional-array wmi

Greatings,我试图用Powershell提取WMI信息,以便通过PHP将它们推送到Mysql DB中。 如果一台机器无法访问互联网,我会导出一个XML文件(正在运行)。

$filePath = $PSScriptRoot + '\processors.xml'
$XmlWriter = New-Object System.XMl.XmlTextWriter($filePath,$Null)

$processor = Get-WmiObject Win32_Processor

$xmlWriter.WriteStartElement("Processor")
foreach ($item in $processor){
$xmlWriter.WriteStartElement($item.DeviceID)
$xmlWriter.WriteElementString("Name",$item.Name)
$xmlWriter.WriteElementString("AddressWidth",$item.AddressWidth)
$xmlWriter.WriteElementString("NumberOfCores",$item.NumberOfCores)
$xmlWriter.WriteElementString("NumberOfLogicalProcessors",$item.NumberOfLogicalProcessors)
$xmlWriter.WriteElementString("L2CacheSize",$item.L2CacheSize)
$xmlWriter.WriteElementString("L3CacheSize",$item.L3CacheSize)
$xmlWriter.WriteEndElement()
}
$xmlWriter.WriteEndElement()

$xmlWriter.Finalize
$xmlWriter.Flush()
$xmlWriter.Close()

但是如果一台机器可以访问互联网,我更喜欢通过HTTP POST将信息直接推送到页面,这将验证信息并将它们存储在数据库中。 这是我的问题,因为我不知道项目的数量(这里是处理器,但想象有内存,硬盘......等)我使用foreach语句来创建XML文件(并且它可以工作)但是,我不知道如何创建等效结构来创建和填充存储CPU信息的多维度$ post处理器。我已经尝试了以下代码,但我被卡住了(这是行不通的):

$processor = Get-WmiObject Win32_Processor

$postprocessor = @()
foreach ($item in $processor){
    $itemarr = @()
    $itemarr += 'Name="'+$item.Name+'"'
    $itemarr += 'AddressWidth="'+$item.AddressWidth+'"'
    $itemarr += 'NumberOfCores="'+$item.NumberOfCores+'"'
    $itemarr += 'NumberOfLogicalProcessors="'+$item.NumberOfLogicalProcessors+'"'
    $itemarr += 'L2CacheSize="'+$item.L2CacheSize+'"'
    $itemarr += 'L3CacheSize="'+$item.L3CacheSize+'"'
    $postprocessor.Add($item.DeviceID+'='+$itemarr)
    # write-host $itemarr
    Remove-Variable itemarr
}

$postParams = $postprocessor
$sending = Invoke-WebRequest -Uri http://localhost:8080/wmi/test.php -Method POST -Body $postParams

事实上我只想存储这样的信息:

$postParam[]
 $postProcessors[]
  ->Processor1[]
   ->Name = value
   ...
   ->L3Cachesize = value
  ->Processor2[]
   ->Name = value
   ...
   ->L3Cachesize = value
 postMemories[...]
 postHardDrives[...]
 etc

也许我没有找到解决我问题的先前答案,如果是事先请原谅我,我会很高兴看到你发送给我的很多链接。 最好的

1 个答案:

答案 0 :(得分:0)

您可能需要的是字典而不是数组数组。

$processor = Get-WmiObject Win32_Processor

$postprocessor = @{}
foreach ($item in $processor){
    $itemHash = @{
        Name = $item.Name
        AddressWidth = $item.AddressWidth
        NumberOfCores = $item.NumberOfCores
        NumberOfLogicalProcessors = $item.NumberOfLogicalProcessors
        L2CacheSize = $item.L2CacheSize
        L3CacheSize = $item.L3CacheSize
    }

    $postprocessor.Add($item.DeviceID, $itemHash)
}

$postParams = $postprocessor

这是我在输出中看到的。

PS C:\> $postprocessor

Name                           Value                                                                                                                                                                                                          
----                           -----                                                                                                                                                                                                          
CPU0                           {Name, NumberOfCores, AddressWidth, NumberOfLogicalProcessors...}                                                                                                                                              



PS C:\> $postprocessor["cpu0"]

Name                           Value                                                                                                                                                                                                          
----                           -----                                                                                                                                                                                                          
Name                           Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz                                                                                                                                                                      
NumberOfCores                  4                                                                                                                                                                                                              
AddressWidth                   64                                                                                                                                                                                                             
NumberOfLogicalProcessors      8                                                                                                                                                                                                              
L2CacheSize                    1024                                                                                                                                                                                                           
L3CacheSize                    6144

PS C:\> ConvertTo-Json -InputObject $postprocessor
{
    "CPU0":  {
                 "Name":  "Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz",
                 "NumberOfCores":  4,
                 "AddressWidth":  64,
                 "NumberOfLogicalProcessors":  8,
                 "L2CacheSize":  1024,
                 "L3CacheSize":  6144
             }
}