web-dev-qa-db-ja.com

大文字と小文字を区別しないPowerShellの置き換え

次のPowerShellスクリプトがあります。

$RegExplorer = Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes
$NullSessionPipes =  $NullSessionPipes.replace("browser", "")
$NullSessionPipes

調べるレジストリキーが、指定したケース「ブラウザ」と完全に一致する限り、スクリプトは正常に機能します。

ただし、レジストリキーの大文字と小文字が異なる場合は、「BROWSER」または「Browser」と言っても、置換は行われません。

String.replaceで大文字と小文字を区別しない方法を探しています。比較を容易にするために、最初に.tolowerまたは.toupperを使用して文字列を変換できることはわかっていますが、この特定のレジストリキーまたはそれにアクセスするアプリケーションで大文字と小文字が区別されるかどうかはわからないため、大文字と小文字を変更したくない既存のキー。

これを行う簡単な方法はありますか?

22
Brad

私を知識人と呼んでください、しかしここで誰も完全に間違っていたわけではありませんが、誰も最終的な解決策のための正しいコードを提供していませんでした。

この行を変更する必要があります:

$NullSessionPipes =  $NullSessionPipes.replace("browser", "")

これに:

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape("browser"), ""

文字列に正規表現文字(例:* + []()など)がない限り、奇妙な[regex]テキストは厳密には必要ありません。しかし、あなたはそれでより安全です。この構文は変数でも機能します。

$NullSessionPipes =  $NullSessionPipes -ireplace [regex]::Escape($stringToReplace), $stringToReplaceItWith
30

NullSessionPipesは複数の文字列値であり、複数の文字列が含まれていると、置換メソッド(大文字と小文字が区別されることに加えて)が失敗する場合があります。 -replace演算子を使用できます。デフォルトでは、すべての比較演算子は大文字と小文字を区別しません。大文字と小文字を区別する演算子は、-creplace、-ceqなどのように「c」で始まります。

'i'で始まる演算子は、-ireplace、-ieqのように大文字と小文字を区別せず、-replace、-ieqと同じです。

詳細については、about_Comparison_Operatorsを参照してください。

10
Shay Levy

代わりに正規表現の置換を使用してください:

$RegExplorer =  Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
$NullSessionPipes = "$($RegExplorer.NullSessionPipes)"
$NullSessionPipes  
$NullSessionPipes = $NullSessionPipes -replace "browser", ""
$NullSessionPipes 
6
Andy Arismendi

.Replaceメソッドには大文字と小文字の区別がないオプションinがありません:

String.Replaceメソッド

...このメソッドは、序数(case-sensitiveおよびculture-insensitive)検索を実行します...

https://msdn.Microsoft.com/en-us/library/fk49wtc1(v = vs.110).aspx

この質問に対する他の回答は、-replaceまたは-ireplace、正規表現の置換を使用する場合は問題ありません。ただし、@ボブが彼(彼女?)のコメントで言及しているように、これは常に適切であるとは限りません。たとえば、置換テキストに$ _などのリテラル文字列を含める場合などです。

他の大文字と小文字を区別する場所から借用した1つのトリックは、「入力」文字列と「検索」文字列を小文字に変換することです。

[PS]> "TeXT".ToLower().Replace("text","NewString")
NewString

ただし...これにより、検索文字列と一致しないものについては出力が小文字になり、許容できない場合があります。

[PS]> "DON'T CHANGE MY TeXT".ToLower().Replace("text","NewString")
don't change my NewString
4
Charlie Joynt