1

PowerShell スクリプトを使用して XML を変更するために Jenkins を介して次のバッチ コマンドを実行しようとすると、

powershell.exe "C:\jenkins\workspace\TemplateJob\Scripts\Common\Prerequsites\Powershell\PowershellScripts\ModifyXML.ps1" "C:\jenkins\workspace\TemplateJob\Scripts\TestNgXML\RegressionTests\Regression.xml" "%Target_Browser%"

次のエラーが表示されます。

値 "System.Object[]" を "System.Xml.XmlDocument" 型に変換できません。エラー: 「リモート サーバーに接続できません」

ただし、同じコマンドは、Jenkins を介して Windows 8 で正常に機能し、Windows 7 でも、スレーブ エージェントが Web Start ( Slave-agent.jnlp) として起動されている場合に正常に機能します。

「デスクトップとの対話をサービスに許可する」を有効にした後も問題が存在します。

次の例を見つけてください: XPath を使用して、指定された XML のパラメーター値をパラメーター値で更新する ModifyXML.ps1。

Regression.xml:

<suite><parameter name="browser" value="ie" /></suite>

ModifyXML.ps1:

param($path, $browser)

$xml = [xml](Get-Content $path) # Getting "Unable to connect to the remote server" error in this line
$xpathbrowser = "/suite/parameter[@name='browser']/@value" 
$nodes = $xml.SelectNodes($xpathbrowser)
foreach ($node in $nodes) {
    if ($node -ne $null) {
        if ($node.NodeType -eq "Element") {
            $node.InnerXml = $browser
        } else {
            $node.Value = $browser
        }
    }
}
4

1 に答える 1

0

私は同じ問題に直面しました。何らかの理由で XML 変換が機能しなくなりました。

これは私の元のコードです:

function UpdateConfigValue($FileName, $xpath, $value) {

    $doc =  [xml](Get-Content $FileName) # no XML transformation any more

    $nodes = $doc.SelectNodes($xpath)

        foreach ($node in $nodes) {
            if ($node -ne $null) {
                if ($node.NodeType -eq "Element") {
                    $node.InnerXml = $value
                }
                else {
                    $node.Value = $value
                }
            }
        }

    $doc.save($FileName)
}

私はさまざまなアプローチを試しましたが、最終的には次の解決策にたどり着きました。

function UpdateConfigValue($FileName, $xpath, $value) {

    $fullpath = Join-Path $(get-location) $FileName # full path to the XML file

    [System.Xml.XmlDocument]$file = new-object System.Xml.XmlDocument
    $file.load($fullpath)

    $node = $file.SelectSingleNode($xpath)
    if ($node -ne $null) {
        if ($node.NodeType -eq "Element") {
            $node.InnerXml = $value
        }
        else {
            $node.value = $value
        }       
    }

    $file.save($fullpath)
}
于 2016-11-02T14:17:53.533 に答える