System.Xml.XmlElement类型的Powershell格式输出

时间:2011-04-15 19:10:58

标签: xml powershell

我试图构建一个计算机名列表,然后可以用来调用另一个powershell命令。

手动流程:

$Type1Machines="Machine1","Machine2","Machine3","Machine4"
Invoke-command {Powershell.exe C:\myscript.ps1 Type1} -computername $Type1Machines

我已经掌握了" Type1"的名称信息。 XML文件中的机器(MachineInfo.xml)

<Servers>
<Type1>
<Machine><Name>Machine1</Name> <MachineOS>WinXP</MachineOS></Machine>
<Machine><Name>Machine2</Name> <MachineOS>WinServer2003</MachineOS></Machine>
<Machine><Name>Machine3</Name> <MachineOS>WinServer2003</MachineOS></Machine>
<Machine><Name>Machine4</Name><MachineOS>WinServer2003</MachineOS></Machine>
</Type1>
</Servers>

我试图编写一个脚本,它可以提取机器名称列表,这些列表是&#34; Type1&#34;并构建以下网址。

  

$ Type1Machines =&#34; MACHINE1&#34;&#34;计算机2&#34;&#34; Machine3&#34;&#34; Machine4&#34;

到目前为止,我已经达到了可以从xml

获取计算机名称列表的程度
    #TypeInformation will be pass as an argument to the final script
    $typeinformation = 'Type1' 
$global:ConfigFileLocation ="C:\machineinfo.xml"
$global:ConfigFile= [xml](get-content $ConfigFileLocation)

$MachineNames = $ConfigFile.SelectNodes("Servers/$typeinformation")
$MachineNames

输出:

Machine
-------
{Machine1, Machine2, Machine3, Machine4}

现在我如何使用上面的输出并构建下面的网址?

$ Type1Machines =&#34; MACHINE1&#34;&#34;计算机2&#34;&#34; Machine3&#34;&#34; Machine4&#34;

感谢任何帮助。谢谢你的时间!

3 个答案:

答案 0 :(得分:3)

接受的解决方案(已复制):

[string[]]$arr = @() # declare empty array of strings
$ConfigFile.SelectNodes("/Servers/$typeInformation/Machine") | % {$arr += $_.name}

具有相同的功能(更多PowerShellish方式,仅在必要时使用.NET):

$typeInformation = 'Type1'
$arr = ($ConfigFile.Servers."$typeInformation".Machine | % { $_.Name }) -join ','

$typeInformation = 'Type1'
$arr = ($ConfigFile | Select-Xml "/Servers/$typeInformation/Machine/Name" | % { $_.Node.'#text' }) -join ','

答案 1 :(得分:2)

我假设您希望将每个计算机名称值放入数组(与invoke-commmand一起使用):

[string[]]$arr = @() # declare empty array of strings
$ConfigFile.SelectNodes("/Servers/$typeInformation/Machine") | % {$arr += $_.name}

答案 2 :(得分:2)

以下是您的代码:您在Xpath查询中忘记了“ Machine

#TypeInformation will be pass as an argument to the final script
$typeinformation = 'Type1' 
$global:ConfigFileLocation ="C:\machineinfo.xml"
$global:ConfigFile= [xml](get-content $ConfigFileLocation)

$Machines = $ConfigFile.SelectNodes("Servers/$typeinformation/Machine")

foreach($Machine in $Machines)
{
  Write-Host $Machine.name
}