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
}
}
您好,我正在尝试使用 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
}
}