Powershell 多维关联 table

Powershell Multidimensional associative table

您好,我正在尝试使用 Powershell 提取 WMI 信息,以便通过 PHP 将它们推送到 Mysql 数据库中。 如果一台机器无法访问互联网,我会导出一个 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 信息的多维数组 $postprocessor。我已经尝试了以下代码,但我被卡住了(那是行不通的):

$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

也许我没有找到以前的答案来解决我的问题,如果是这样的话,请提前打扰,我很乐意阅读您发送给我的尽可能多的链接。 最佳

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

$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
             }
}