我想在PowerShell脚本中读取每行XML文件。在Get-Content
XML文件之后,我使用foreach
语句来读取每个行元素。它没有工作。如何阅读每行XML文件?
Test.xml
:
<?xml version="1.0" encoding="utf-8"?>
<Install-Plan>
<ADSetup> ... </ADSetup>
<SQLSetup>
<SqlServerName>ServerName</SqlServerName>
<SqlVersion>SQL2014</SqlVersion>
<InstanceName>MSSQLSERVER</InstanceName>
<SqlInstall>TRUE</SqlInstall>
<SqlClientInstall>TRUE</SqlClientInstall>
<RSInstall>TRUE</RSInstall>
...
</SQLSetup>
</Install-Plan>
的PowerShell:
[xml]$XmlData = Get-Content test.xml -ErrorAction Stop
$Config = $xmlData.SelectNodes("//Install-Plan");
$uConfigFile = $Config.CommonConfig.SQLSetup
foreach ($uconfigval in $uConfigFile) {
switch ($uconfigval[0]) {
"$SQLServerData.SQLSetup.Sqlserver" {$uSQL_SERVER_NAME = $uconfigVal.Trim()}
"$SQLServerData.SQLSetup.SqlVersion" {$uSQLVERSION = $uconfigVal[1].Trim()}
...
}
答案 0 :(得分:0)
您发布的示例XML没有节点<CommonConfig>
,因此$uConfigFile = $Config.CommonConfig.SQLSetup
将产生空结果。此外,switch
语句的变量和条件完全关闭。
你真正想做的是这样的事情:
foreach ($node in $xmlData.SelectNodes('/Install-Plan/SQLSetup/*')) {
switch ($node.Name) {
'SqlServerName' { $uSQL_SERVER_NAME = $node.InnerText.Trim() }
'SqlVersion' { $uSQLVERSION = $node.InnerText.Trim() }
...
}
}
或(或许更好)填充哈希表而不是单个变量:
$cfg = @{}
foreach ($node in $xmlData.SelectNodes('/Install-Plan/SQLSetup/*')) {
$cfg[$node.Name] = $node.InnerText.Trim()
}