我正在使用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"
答案 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')
}