"("char在PowerShell中不起作用

Joh*_*ter 3 powershell

我不能让这个工作.它不喜欢"("char;

我如何解决它?

 Dir | Rename-Item -NewName { $_.name -replace "(","" }
Run Code Online (Sandbox Code Playgroud)

如何在PowerShell中处理这种类型的特殊字符?

von*_*ryz 9

我们试着稍微分析一下这个问题吧.首先,创建一些包含括号的虚拟文件,

for($i=0;$i -le 4; ++$i) { set-content -path $("file($i).txt" -f $i) -value $i }
Output:
gci
    Directory: C:\temp\foo
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         17.2.2014     10:34          3 file(0).txt
-a---         17.2.2014     10:34          3 file(1).txt
-a---         17.2.2014     10:34          3 file(2).txt
-a---         17.2.2014     10:34          3 file(3).txt
-a---         17.2.2014     10:34          3 file(4).txt
Run Code Online (Sandbox Code Playgroud)

现在我们有一些测试数据,让我们尝试运行一个提供错误消息的命令,

Dir | Rename-Item -NewName { $_.name -replace "(","" }

Rename-Item : The input to the script block for parameter 'NewName' failed.
Invalid regular expression pattern: (.
At line:1 char:27
+ Dir | Rename-Item -NewName <<<<  { $_.name -replace "(","" }
    + CategoryInfo          : InvalidArgument: (file(0).txt:PSObject) [Rename-Item], ParameterBind   ingException
    + FullyQualifiedErrorId : ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.Re   nameItemCommand
Run Code Online (Sandbox Code Playgroud)

哎呀!错误消息表明使用了无效的正则表达式.这意味着-replace不只是替换字符串,但它也支持正则表达式!

为了-replace将输入视为文本文本而不是正则表达式,输入需要进行转义.简单的方法是插入反斜杠\,但这很快就会变得乏味.幸运的是,这是一种更简单的方法,因为.Net Regex类有一个内置的转义方法[Regex]::Excape().像这样,

Dir | Rename-Item -NewName { $_.name -replace [regex]::escape("("),"" }
Output:
ls
    Directory: C:\temp\foo
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         17.2.2014     10:34          3 file0).txt
-a---         17.2.2014     10:34          3 file1).txt
-a---         17.2.2014     10:34          3 file2).txt
-a---         17.2.2014     10:34          3 file3).txt
-a---         17.2.2014     10:34          3 file4).txt
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 9

你已经从@vonPryze那里得到了关于你问题的确切原因的很好的解释,但是有一个更简单的解决方案.该-replace运营商使用其需要转义正则表达式,但.Replace()字符串的方法只使用一个字符串.因此,如果您不需要正则表达式,只需使用该方法,并且无需转义任何内容:

dir | rename-item -NewName { $_.name.Replace("(","") }
Run Code Online (Sandbox Code Playgroud)

  • 另外,我认为应该提到,`Replace`方法区分大小写,但比`-Replace`运算符快一点. (3认同)