XMLのファイルの属性を変更するためのPowershellスクリプトを作成していますが、うまく該当するパートのみの変更ができず、どなたかのアドバイスお力添え頂ければと投稿させて頂きました。恐れ入りますが、どうぞよろしくお願い致します。
目的
アプリケーションが出力するログレベルが定義されているlogger.configファイルの中の/log/root/levelの属性値(小要素)となるログモードの値をスクリプト実行により書き換える事を目標としております。以下の例では、"DEBUG"となっておりますが、"ERROR"に変更または逆のケースを想定しています。
スクリプト実行前
<log>
<root>
<level value="DEBUG" />
</root>
<log>
スクリプト実行後
<logger>
<root>
<level value="ERROR" />
</root>
<logger>
問題
方針としては、以下3つのアプローチを試しております。
できればXML形式にコンバートした上、操作の柔軟性の高そうな1、2番の方法を優先したいと考えております。
1.setValueメソッドによる値の更新
以下エラーが発生してしまいます。
Exception calling "SetValue" with "1" argument(s): "Operation is not valid due to the current position of the navigator."
2.XPathNavigatorを使う
以下の記事でrootノードの変更は不可とあるので、使えないのかも知れません。
https://docs.microsoft.com/ja-jp/dotnet/standard/data/xml/modify-xml-data-using-xpathnavigator
上記2つのアプローチがだめな場合は、
3.XMLにコンバートせずに該当の箇所を直接書き換える
以下のコマンドにより<root>行の次の行の所得が可能になったので、これを発展させて該当の箇所を書き換える。
$rootLines = Select-String -Pattern "<root>" $loggerConfig -Context 0, 1
Powershellスクリプト
$homeDir = 'C:\Users\Desktop\PS_Folder' $targetFile = 'logger.config' $targetDirs = @('DirA','DirB') #logger.configが存在する2つのフォルダ foreach ($targetDir in $targetDirs) { #フォルダをループしlogger.configファイルを取得 $newDir = $homeDir + '\' + $targetDir $loggerConfigs= Get-ChildItem $newDir -recurse -include $targetFile foreach ($loggerConfig in $loggerConfigs) { #ひとつずつ取り出したlogger.configをXMLにコンバート $log = [XML](Get-Content $loggerConfig) #----以下いずれかの方法を使う---- #方法1 $logLevelValue = $log.logger.root.level $logLevelValue.Current.SetValue("ERROR") #方法2 XPathNavigatorで扱えるようにして属性の値を変更するかも検討 $logLevelValue =[Xml.Xpath.XPathNavigator] $log.CreateNavigator() $levelValue = $logLevelValue .Select("/logger/root/level") $levelValue = "ERROR" } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/08 14:13