質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

3050閲覧

Powershell XML ファイル属性値に対する変更エラー

minhouse10

総合スコア41

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/03/08 09:02

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" } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あまりxmlは触ったことがないんですが、単純に以下のようにしてもできませんか?
あとxmlのパスが"logger"と"log"で統一されてないようですが、そこら辺りのミスも確認してみてください。

powershell

1$log = [xml](Get-Content "パス") 2$log.logger.root.level.value = "ERROR" 3$log.Save("パス")

投稿2019/03/08 13:26

編集2019/03/08 13:29
mitarai

総合スコア223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2019/03/08 14:13

mitarai様、ご回答頂きまして真にありがとうございます! ご教授頂いた方法で簡単に変更ができました。今日一日中悩んでいたのですが、本当にびっくりです。また表記統一ができていない点につきましてもご指摘頂きありがとうざいました!以後もう少し自己チェックを厳しくできるように心がけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問