1

この投稿から、ディレクトリのサブファイル内の文字列を Windows XP の Powershell に置き換えることができました。

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) |
       foreach { $_ -replace "D:","C:\path" }  |
       sc $f.fullname 
    }

残念ながら、いくつかの例外的なケースでは、"C:\" ではなく "C:\\" が必要でした。

次のコマンドを使用してこの問題を解決しようとしましたが (「C:\path\\」を「C:\\path\\」に置き換えます)、失敗しました:

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) |
       foreach { $_ -replace "C\path\\","C:\\path\\" }  |
       sc $f.fullname 
    }

エラーは次のとおりです。

Invalid regular expression pattern: C:\path\\

問題を回避するためにいくつかのバリアントを試しましたが、すべて同じエラーが発生します (上記の行 #3 を置き換えます)。

foreach { $_ -replace "C:\path\\\\","C:\\path\\" } |
foreach { $_ -replace 'C:\path\\',"C:\\path\\" } |
foreach { $_ -replace "`C:\path\\","C:\\path\\" } |
foreach { $_ -replace 'C:\path\\\\',"C:\\path\\" } |

何かご意見は?

4

3 に答える 3

3

「C:\ path \」を「C:\\path\\」に置き換えて交換する場合

使用する

$_ -replace "c:\\path\\\\","c:\\path\\"

一致パターンは正規表現であり、「\」は「\」でエスケープする必要があります。置換文字列は単なる文字列であり、エスケープ文字は必要ありません

于 2012-07-06T21:27:17.220 に答える
0

CBが言ったことを詳しく説明すると、文字列の「\」を置き換えるときは、文字列の「検索」部分でエスケープする必要があります。これを行う最も簡単な方法は次のとおりです

$escapedPath = $path -replace "\\","\\" 

または明確にするために:

$escapedPath = $path -replace [RegEx]"\\",[String]"\\"

-replace の最初のパラメーターは RegEx であるため、"\" の扱いが、文字列データ型である後半部分とは異なります。

于 2013-09-27T20:03:22.360 に答える