简体   繁体   中英

How to escape a backslash in Powershell

I'm writing a powershell program to replace strings using

-replace "$in", "$out"

It doesn't work for strings containing a backslash, how can I do to escape it?

The -replace operator uses regular expressions, which treat backslash as a special character. You can use double backslash to get a literal single backslash.

In your case, since you're using variables, I assume that you won't know the contents at design time. In this case, you should run it through [RegEx]::Escape() :

-replace [RegEx]::Escape($in), "$out"

That method escapes any characters that are special to regex with whatever is needed to make them a literal match (other special characters include . , $ , ^ , () , [] , and more.

You'll need to either escape the backslash in the pattern with another backslash or use the .Replace() method instead of the -replace operator (but be advised they may perform differently):

PS C:\> 'asdf' -replace 'as', 'b'
bdf
PS C:\> 'a\sdf' -replace 'a\s', 'b'
a\sdf
PS C:\> 'a\sdf' -replace 'a\\s', 'b'
bdf
PS C:\> 'a\sdf' -replace ('a\s' -replace '\\','\\'), 'b'
bdf

Note that only the search pattern string needs to be escaped. The code -replace '\\\\','\\\\' says, "replace the escaped pattern string '\\\\' , which is a single backslash, with the unescaped literal string '\\\\' which is two backslashes."

So, you should be able to use:

-replace ("$in" -replace '\\','\\'), "$out"

[Note: briantist's solution is better.]

However, if your pattern has consecutive backslashes, you'll need to test it.

Or, you can use the .Replace() string method, but as I said above, it may not perfectly match the behavior of the -replace operator:

PS C:\> 'a\sdf'.replace('a\\s', 'b')
a\sdf
PS C:\> 'a\sdf'.replace( 'a\s', 'b')
bdf

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM