2017-05-24 13 views
2

PowerShellを使用して簡単に検索して置換しようとしています。基本的に、私は "マスター"ファイルと同じ名前のディレクトリにサポートファイルをいくつか持っていました。これらのサポートファイルの1つを除くすべてのファイルはもはや必要ありません。 「マスター」ファイルには、他のファイルのパスへのテキスト参照があります。私がしたいのは、 "master"ファイル内のこのパスを変更して、削除されたディレクトリを削除することです。私はこの行をしたいと思いますPowerShellを使用して、文字列に+が含まれている文字列を置き換えます。

/temp/this+that/this+that.dat 

:たとえば

、のは、私が今C:\Temp\this+that.dat

C:\Temp\this+that.txtに移動している私はC:\Temp\this+that\this+that.datを持っているために使用されるファイルC:\Temp\this+that.txtはこのようなラインを持っているとしましょう次のようになります:

/temp/this+that.dat 

バッチファイルが動いているこれらのファイルはたくさんあります。以下のpowershellコマンドを使用して、プラス記号+を含んでいないすべてのファイル名を使用すると、すべてが正常に動作しています。これらのファイルの場合、以下の呼び出しは機能しません。上記の例の場合

powershell -Command "(gc '!CURRENT_FILE!') -replace '/!BASE_NAME!/', '/' | Set-Content '!CURRENT_FILE!'" 

CURRENT_FILEC:\Temp\this+that.txtBASE_NAMEthis+that

だろうだろう誰もが、これはプラス+記号を含むファイル名のために働いていない理由で私を助けることができますか?

+2

ここでの問題は、あなたが正規表現として '!BASE_NAME! 'を扱っているということです。私はPowerShellの周りに私の道を知らないが、[この答えはそれが助けるかもしれないように見える](https://stackoverflow.com/questions/23651862/powershell-how-to-escape-all-regex-characters-from-aストリング#23651909)。基本的には、特殊なRegexの意味を持つすべての文字をエスケープしてから式に挿入する必要があります。 –

+2

@ma_ilはまさに正しいです。 '+'文字はRegExの特殊文字なので、エスケープする必要があります。 ''(gc '!CURRENT_FILE!')-replace [regex] ::エスケープ( '/!BASE_NAME!/')、 '/' |セット内容 '!CURRENT_FILE!' " – TheMadTechnician

答えて

2

@ma_ilは正確です。 '+'文字はRegExの特殊文字なので、エスケープする必要があります。

powershell -Command "(gc '!CURRENT_FILE!') -replace [regex]::escape('/!BASE_NAME!/'), '/' | Set-Content '!CURRENT_FILE!'" 
+0

ありがとうございました!これは機能します。 – NickB

関連する問題