2017-10-24 13 views
0

私は、(私はPowerShellのV5.1を使用しています)次のPowerShellスクリプトを持って、私が撮ったし、この前のポストから主に適応した:Replace multiline text in a file using Powershell without using RegexPowerShellのセット内容複数行を交換する方法

$oldCode = @" 
     <httpProtocol> 
      <customHeaders> 
       <clear /> 
      </customHeaders> 
      <redirectHeaders> 
       <clear /> 
      </redirectHeaders> 
     </httpProtocol> 
"@ 

$newCode = @" 
     <httpProtocol> 
      <customHeaders> 
       <add name="X-Frame-Options" VALUE="SAMEORIGIN"></add> 
      </customHeaders> 
      <redirectHeaders> 
       <clear /> 
      </redirectHeaders> 
     </httpProtocol> 
"@ 

$Path = "c:\Windows\System32\inetsrv\config\applicationHost.config" 
$Content = (Get-Content $Path -Raw).replace($oldCode,$newCode) 

Set-Content -Path $Path -Value $Content -Verbose 

これは$ oldCodeに代わるものではありません。私はWrite-Outputを使用して$ Content変数をチェックしましたが、文字列を置き換えていないので、Set-Contentコマンドの問題ではなく、文字列または置換コマンド自体に問題があると想定しています。

これを行うにはどのようなアイデアがありますか?

+0

'Get-Content'は、テキストファイルで使用すると、内容を文字列の配列として返します。配列の各エントリはファイルの1行です。しかし、heredoc(これは '$ oldcode'と' $ newcode'のために使用しています)は文字列配列ではなく単純な文字列なので、 '.replace()'は失敗しています。 –

+0

私がリンクした前の投稿から、 '-Raw'パラメータは' Out-String'に相当すると思いました。 '$ Content.GetType()'を追加すると、配列ではなく文字列であることがわかります( '-Raw'を削除すると)、System.Arrayオブジェクトに戻ります。 –

+0

私は '-Raw'を見逃しました。リンクされたポストは、 '.replace()'メソッドではなく '-replace'演算子を使用しています。 2つは実際に異なって動作します。それらのうちの1人はregexpを使用します(しかし私はどちらを思い出さないか)。 '.replace($ oldcode、$ newcode)'を '-replace $ oldcode、$ newcode'に置き換えてみてください。 –

答えて

0

最終的に私は以下を使用しました。これは、APIを使用して要素を構成することもできる唯一の選択肢ではありません。

$xmlPath = "c:\windows\system32\inetsrv\config\applicationHost.config" 

[xml]$xml = Get-Content -Path $xmlPath 

[xml]$xFrameXml = @" 
      <customHeaders> 
       <add name="X-Frame-Options" value="SAMEORIGIN" /> 
      </customHeaders> 
"@ 

foreach($node in $xml.SelectNodes('/configuration/system.webServer/httpProtocol/customHeaders')){ 
    $node.ParentNode.AppendChild($xml.ImportNode($xFrameXml.customHeaders, $true)); 
    $node.ParentNode.RemoveChild($node); 

} 
$xml.Save($xmlPath); 

また、単に.ReplaceChildを使用することができるかもしれませんが、私は、そのための正しい構文を発見していないので、誰もがない場合、それは潜在的にきれいになります。

正しい方向に私を向けるためのAnsgarのおかげです。

関連する問題