Хотя подход с двойным обратным трюком может сработать, я бы рекомендовал метод Regex.Escape
.Безопасно и полезно, если экранируемая строка поступает из внешнего источника.
Regex.Escape(String)
Метод
Escape минимальный набор символов (\
, *
, +
, ?
, |
, {
, [
, (
, )
, ^
, $
, .
, #
и пробел ), заменив их кодами перехода.Это указывает механизму регулярных выражений интерпретировать эти символы буквально, а не как метасимволы.
Пример :
$SomeString = '[square]'
$SafeString = [regex]::Escape( $SomeString )
Get-ChildItem -Recurse |
Where-Object { $_.Name -match $SafeString } |
ForEach-Object { $_ |
Rename-Item -NewName $($_.Name -replace $SafeString, '') -WhatIf
}
Результат :
PS D:\PShell> D:\PShell\SO\53619911.ps1
What if: Performing the operation "Rename File" on target "Item: D:\PShell\DataFi
les\some[square]file.txt Destination: D:\PShell\DataFiles\somefile.txt".
What if: Performing the operation "Rename File" on target "Item: D:\PShell\DataFi
les\some[square]file2.txt Destination: D:\PShell\DataFiles\somefile2.txt".