2016-05-24 6 views
-1

xmlノードを同じファイル内にコピーしようとしていますが、エラーが表示されます。 をご確認ください。同じファイル内のPowerShell XMLコピーノード

のPowerShellスクリプト:

$path=".." 
cd $path 
[xml]$xdoc = Get-Content $path 
$NodeToClone = $xdoc.root.Version.Version.Builds.Build.Clone() 
$xdoc.DocumentElement.AppendChild($NodeToClone) 
$xdoc.Save($path) 

XMLファイル:

<root> 
    <Versions> 
    <Version Number="3"> 
     <Builds> 
     <Build Number="205" Version="30"> 
      <Steps> 
      <Step Number="1" Build="205" Version="3"> 
       <SubSteps> 
       <SubStep Number="1" comment="" /> 
       </SubSteps> 
      </Step> 
      <Step Number="2" Build="205" Version="3"> 
       <SubSteps> 
       <SubStep Number="1" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" /> 
       <SubStep Number="2" Path="" File="" Action="" CSV_Type="" cq_number="" continue_on_error="" comment="" /> 
       </SubSteps> 
      </Step> 
      <Step Number="3" Build="205" Version="3"> 
       <SubSteps> 
       <SubStep Number="1" comment="" /> 
       </SubSteps> 
      </Step> 
      </Steps> 
     </Build> 
     </Builds> 
    </Version> 
    </Versions> 
</root> 

私は次の番号206のビルドノードをコピーしたいが、私は以下のエラーが取得しています:

You cannot call a method on a null-valued expression. At D:\Powershell-MyScripts\test.ps1:6 char:48 + $NodeToClone = $xdoc.root.Version.Version.Clone <<<<() + CategoryInfo : InvalidOperation: (Clone:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

Exception calling "AppendChild" with "1" argument(s): "Object reference not set to an instance of an object." At D:\Powershell-MyScripts\test.ps1:7 char:34 + $xdoc.DocumentElement.AppendChild <<<< ($NodeToClone) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

答えて

1

あなたのXMLパス(...のVersion.Version ...ではなく、...バージョン...バージョン...)の忘れました

0123あなたはおそらく

$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone) 

に自分のクローン化されたノードを追加するノードを変更したいほか

$NodeToClone = $xdoc.root.Versions.Version.Builds.Build.Clone() 

それ以外の場合は、あなたの前のノードと同じレベルではありません。コメント欄での議論の後

更新:

[xml]$xdoc = Get-Content $path 
$NodeToClone = @($xdoc.root.Versions.Version.Builds.Build)[-1].Clone() 

$NodeToClone.Number = ([int]($NodeToClone.Number) + 1).ToString() 
foreach ($step in $NodeToClone.Steps.Step) { 
    $step.Build = $NodeToClone.Number 
} 

$xdoc.root.Versions.Version.Builds.AppendChild($NodeToClone) 
$xdoc.Save($path) 
+0

おかげで、しかし、今では、コード1時間を実行しているノードを3回コピーされます。 – SteveScm

+0

さて、どのノードをコピーしたいのかははっきりしないと思います。それは "ビルド"ノードか、その子供の1つ、つまり "ステップ"ノードですか?現在、コードは3つの追加の「ステップ」ノードをもたらす「ビルド」ノードをコピーします... – DAXaholic

+0

番号の増分値を持つビルドノード全体。 205のように、次のノード206など...しかし、それは発生してはならないノードを3回コピーしています。 1回のコード実行で1回でなければなりません。 – SteveScm

関連する問題