Получение данных из XML в Powershell - использование Xpath - PullRequest
0 голосов
/ 13 июля 2020

У меня есть конфигурация XML, из которой я пытаюсь прочитать информацию в скрипте Powershell. Сценарий Powershell принимает ввод от пользователя, а затем ему необходимо перейти к каждому пути. Моя конфигурация XML выглядит следующим образом:

<?xml version="1.0"?>
<Config>   
  <Action Name="Deploy">
            <CommandPath>path to navigate</CommandPath>
            <PackagePath>path of Application package</PackagePath>
        <ModelName>Name of model to be deployed</ModelName>
        <ServiceName>Name of Service</ServiceName>
            <DeploymentServer>
                <Server Name = 'Server1'></Server>
                <Server Name = 'Server2'></Server>
            </DeploymentServer>
  </Action>
  <Action Name="Update">
            <CommandPath>path to navigate</CommandPath>
            <PackagePath>path of Application package</PackagePath>
        <ModelName>Name of model to be updated</ModelName>
            <ServiceName>Name of Service</ServiceName>
            <DeploymentServer>
                <Server Name = 'Server1'></Server>                
            </DeploymentServer>
  </Action>     
</Config>

Если пользователь вводит Deploy, необходимо учитывать развертываемые узлы, если пользовательский ввод обновляется, то путь обновления. Код Powershell должен выполняться для каждого элемента в узле DeploymentServer для каждого элемента действия. Я пробовал, как показано ниже, но не могу получить правильную информацию об узле в Powershell.

Set-ExecutionPolicy RemoteSigned

function RunConfiguration()
{
$XML = Select-Xml -Path $configFile -XPath 'Action' | Select-Object -ExpandProperty Node
do {
 $Answer = Read-Host -Prompt "Select required action ""$($XML.Action.Name -join '", "')"" "
} Until ($Answer -in ($XML.Action.Name))
Write-Host $XML.Action

$SelectedAnswer = $XML.Action | Where-Object {$_.Name -eq $UserOpt}
Write-Host $SelectedAnswer
$SelectedAnswer.DeploymentServer.Server | ForEach-Object {
    $ServerName = $_.Name
    Write-Host $ServerName
    Invoke-Command -ComputerName $ServerName -ScriptBlock {
        $Configuration = $args[0]   
        $Configuration.CommandPath
        $Configuration.PackagePath
        $Configuration.ModelName
        $Configuration.ServiceName
    } -ArgumentList $SelectedAnswer
   }
   }
}
}

$spAdminServiceName = "SPAdminV4"
$currentDir=(split-path $myinvocation.mycommand.path -parent)
$configFile = $currentDir
$configFile += "\DeployConfig.xml"
Execute-Commands $configFile

RunConfiguration()

Write-Host -f White "Press Enter key to exit..."
Read-Host

Как читать данные? Спасибо

1 Ответ

1 голос
/ 13 июля 2020

Вашему XPath действительно требуется //Action (см. Синтаксис XPath ), но, прежде всего, вам нужно быть более согласованными с именами переменных.

В какой-то момент вы захватываете пользователя ввод в переменную $Answer, но затем вы используете неопределенную переменную $UserOpt ..

Попробуйте:

$configfile = 'D:\Test\config.xml'
# get an array of 'Action' XmlElements
$actionNodes = (Select-Xml -Path $configFile -XPath '//Action').Node

do {
    $Answer = Read-Host -Prompt "Select required action '$($actionNodes.Name -join "', '")'"
} Until ($Answer -in ($actionNodes.Name))

$selectedNode = $actionNodes | Where-Object {$_.Name -eq $Answer}
Write-Host $selectedNode.Name

$selectedNode.DeploymentServer.Server | ForEach-Object {
    $ServerName = $_.Name
    Write-Host $ServerName

    # do your Invoke-Command on the $ServerName here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...