0

コンピューターに関する情報をXMLで収集して保存することになっているPowerShellコードを作成しています。しかし、IP、MAC、ネットワークカードの名前を取得できないようです。

これが私が書いたいくつかのコードの例です(作業コード):

#OSInfo
$newosinfo = (@($xml.computer.software.osinfo)[0])
Get-WmiObject -computer $compname Win32_OperatingSystem | 
ForEach-Object {
        $newosinfo = $newosinfo.clone() 
        $newosinfo.caption = $_.caption
        $newosinfo.serialnumber = [string]$_.serialnumber
        $newosinfo.OSArchitecture = $_.OSArchitecture
        $newosinfo.manufacturer = $_.manufacturer
        #Time $newosinfo.installdate;
        $xml.computer.software.AppendChild($newosinfo) > $null
}
$xml.computer.software.osinfo | where-object {$_.caption -eq ""} | foreach-object {$xml.computer.software.RemoveChild($_)}

そして、これが私が書き込もうとしたコードです(動作しないコード):

$newnetwork = (@($xml.computer.software.network)[0])
Get-WmiObject -computer $compname Win32_NetworkAdapter -Filter 'NetConnectionStatus=2' | 
ForEach-Object {
        $newnetwork = $newnetwork.clone()
        $newnetwork = 1 | Select-Object Name, MAC, IP 
        $newnetwork.Name = $_.Name
        $newnetwork.MAC = $_.MacAddress
        $IP = $_.GetRelated('Win32_NetworkAdapterConfiguration')
        $newnetwork.IP = $IP | Select-Object -expand IPAddress
        $xml.computer.software.AppendChild($newnetwork) > $null
}
$xml.computer.software.network | where-object {$_.Name -eq ""} | foreach-object {$xml.computer.software.RemoveChild($_)}

このコードは、このエラーを出します:

Cannot convert argument "0", with value: "@{Name=Intel(R) 82579V Gigabit Network Connect
ion; MAC=F4:6D:04:40:DB:6F; IP=10.0.0.12}", for "AppendChild" to type "System.Xml.XmlNod
e": "Cannot convert the "@{Name=Intel(R) 82579V Gigabit Network Connection; MAC=F4:6D:04
:40:DB:6F; IP=10.0.0.12}" value of type "Selected.System.Int32" to type "System.Xml.XmlN
ode"."
At A:\Dropbox\Bachelorprosjekt\Kode\Fungerende Script+kode\infoGatherer.ps1:177 char:43
+         $xml.computer.software.AppendChild <<<< ($newnetwork) > $null
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

だから私の質問は、上記のようなコードを知っているか、書くことができる人がいますか?ちなみに、「アクティブ化された」カードに関する情報のみを収集する方が賢明ですか?

4

1 に答える 1

1

まず、XmlNodeを配列でラップし、次にラップを解除する理由がわかりません。次の2行が同等であることがわかる限り、次のようになります。

$a = (@($xml.computer.software.network)[0])
$b = $xml.computer.software.network

私が見つけた2番目のことは1 | Select Name, MAC, IP、XmlNodeでこれらのプロパティを設定するために使用していると思われる、この奇妙なものがありますか?実際に行っているのは、以前に複製した$ newnetworkオブジェクトをXmlNodeからPSCustomObjectクラスに変更することです。これは、後で、appendChild()メソッドへの引数として渡そうとすると壊れます。

これがあなたが探していることをするかもしれないいくつかの実用的なPowerShellコードです。私はあなたのXML構造についていくつかの仮定をしているので、あなたはあなたの正確なニーズに合うようにそれを適応させる必要があるかもしれません:

# setup sample XML
$xml = [xml]"
  <computer><software><network>
    <Name />
    <MAC />
    <IP />
  </network></software></computer>"

# duplicate network XmlNode and grab necessary info through WMI
# note: there may be more than one IP Address bound
#       on a given adapter. Use just the first one.
$info = $xml.computer.software.network.clone()
$nic = Get-WmiObject Win32_NetworkAdapter | select -first 1
$ip = $nic.GetRelated("Win32_NetworkAdapterConfiguration") | 
    select -expand IPAddress -first 1

# populate children with correct values
$info.Name = $nic.Name
$info.MAC = $nic.MACAddress
$info.IP = [string]($ip)

# finally append new XmlNode to software node
$xml.computer.software.appendChild($info)
于 2012-04-10T23:33:39.333 に答える