将String从XML转换为Array

时间:2017-12-21 20:54:00

标签: powershell

我正在使用PowerShell设置无人参与的软件安装。

如果我使用以下代码为安装程序设置参数($Servers),则安装正常:

$Servers = "Server1.$($env:USERDNSDOMAIN)","Server2.$($env:USERDNSDOMAIN)"

但我想从外部XML文件中获取设置,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Servers>"Server1.$($env:USERDNSDOMAIN)","Server2.$($env:USERDNSDOMAIN)"</Servers>
</Settings>

我使用以下代码检索Powershell中的数据:

[Xml]$xmlConfigFile = Get-Content -Path "C:\Temp\Settings.xml"
$Servers = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigFile.Settings.Servers)

这不起作用。安装失败。 我认为这是因为我从XML中获取了一个字符串,而不是像上面第一个例子中那样的数组。 解决问题的最佳方法是什么?

我考虑过.Split(","),但报价是个问题。我也试过ConvertFrom-Csv,但这也没有用。

修改 变量$Servers在其工作时的输出是:

Server1.domain.local
Server2.domain.local

来自XML的变量$Server的输出是:

"Server1.domain.local","Server2.domain.local"

1 个答案:

答案 0 :(得分:0)

是的,从XML数据中获得的值是单个字符串,而不是数组,因此您需要将其拆分为从字符串到数组。您可以在拆分字符串之前删除双引号(PowerShell允许您进行菊花链方法调用,返回值):

$Servers = $Servers.Replace('"', '').Split(',')

但是,更好的方法是通过将值放在单独的节点中来修复输入数据:

<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Servers>
    <Server>Server1.$($env:USERDNSDOMAIN)</Server>
    <Server>Server2.$($env:USERDNSDOMAIN)</Server>
  </Servers>
</Settings>

所以你可以像这样处理数据:

$Servers = $xmlConfigFile.Settings.Servers.Server | ForEach-Object {
    $ExecutionContext.InvokeCommand.ExpandString($_)
}

或者像这样:

$Servers = $xmlConfigFile.SelectNodes('//Server') | ForEach-Object {
    $ExecutionContext.InvokeCommand.ExpandString($_.'#text')
}