2017-08-17 15 views
1

XMLベースの.configファイルのグループを更新しようとしています。私はプラス記号が含まれている場合、スクリプトは何もしませんPowerShellで文字列値をプラス記号 "+"で編集/置換できません

< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= /> 

:私は私のスクリプトに置き換えることはできませんプラス記号を含むファイル内の文字列があります。すべての設定が変わるので、私はテキストを置き換える必要があります - 新しいファイルだけで行くことはできません。

ファイル内の一致する値が指定された値に置き換えられますが、+シンボルはこれを許可していません。ここに私のPSスクリプトです:私はプラス記号にすべてのテキストを置き換え試験として

$DIRs = Get-ChildItem -Path "C:\TEST" -Directory 
Get-ChildItem $DIRs -File -Recurse -Filter *.config | 
    ForEach { (Get-Content $_.FullName) | 
    ForEach { $_ -replace '< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />','< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />' } | 
    Set-Content $_.FullName } 

、それがうまく働いたが、私は残っていたとして、プラス記号と、次は新しいテキストの最後に存在しましたスクリプトの "+ nopqrst"。

PSV3、FYIで実行しています。

+1

プラス記号の前にバックスラッシュ文字を入力してください。 – thepi

+0

'< foo=bar= />'は無効です。あなたのデータは実際にそのように見えますか?それ以外の場合は、XMLパーサーを使用する方が適切なアプローチかもしれません。 –

+0

@AnsgarWiechers - 私のXMLは正常ではありませんが、これはすべての情報が取り除かれた状態での簡単な表現でした。 –

答えて

6

演算子-replaceは、最初の後置引数に正規表現を使用して検索パターンを定義します。正規表現では、特定の文字はspecial meaningです。 +は、特に、「1回またはそれ以上の先行(副)式」を意味する、いわゆる「定量器」である。リテラル特殊文字を置き換えるには、それらをエスケープする必要があります。

幸い、ビルトインmethod for escaping stringsがあります:

$_ -replace [RegEx]::Escape('< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />'),'< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />' 
+1

しかし、 '[regex] :: Escape()'は与えられた文字列中のすべての特殊文字をエスケープすることに注意してください。あるリテラル(サブ)文字列を別のリテラル(サブ)文字列に置き換える場合は、 '$ _。Replace( 'foo'、 'bar')'の代わりに 'String.Replace()'メソッドを使用することを考えてください。 –

+0

どちらも非常に役に立ちます! @Ansgar、そのヒントのおかげで、私はその方法を使用していないが、将来は恥ずかしがり屋ではありません。 –

+0

@Baconビットは私のためにこれを解決しました!彼のスクリプトに対する彼の調整は成功したと判明しました。ありがとうございました! –

0

XMLファイルには、有効なXMLデータを持っていて、ノード属性の値を変更したい場合は、適切なXMLを使用して検討する必要がありますこのようなパーサ、:

$xmlfile = 'C:\path\to\your.config' 

[xml]$xml = Get-Content $xmlfile 
$attr = $xml.SelectSingleNode('//somenode/@SharedPassKey') 
$attr.'#text' = $attr.'#text'.Replace('+', '.') 

$xml.Save($xmlfile) 

はそれがあることが必要であるとして特定としての属性を選択するためのXPath expressionを行います。これにより、+をその属性の.に置き換えることができます。

+0

こんにちはAnsgar、私は長い間、このことをやり直してきましたが、最終的には特別キャラクターが私をトラックに止めました。 私はあなたが提供した方法に精通しておらず、あなたが残した例は、サブディレクトリ内の複数のファイルをカバーするようではありません。また、このメソッドで編集する文字列を指定する方法もわかりません。 明らかに、私はレッスンを期待していません。私は自分の研究/勉強をしていますが、あなたの意見や以前のコメントは高く評価されています。私がこの方法を学ぶことができれば、より効率的であることがわかります。 –

+0

このコードは、XMLパーサーを使用して属性値を置き換える方法の単なる例です。それはターンキーソリューションではありません。また、この方法では、単一の文字列を指定しません。値を変更する属性を選択するためのXPath式と、その値の置換操作があります。 –

関連する問題