我无法让这个工作。它不喜欢“(”char;
我该如何解决?
Dir | Rename-Item -NewName { $_.name -replace "(","" }
如何在PowerShell中处理这种特殊字符?
答案 0 :(得分: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
现在我们有了一些测试数据,让我们尝试运行一个提供错误信息的命令,
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
糟糕!错误消息显示使用了无效的正则表达式。这意味着-replace
不会只是替换字符串,但它也支持regular expressions!
为了让-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
答案 1 :(得分:9)
你从@vonPryze那里得到了关于你问题的确切原因的一个很好的解释,但是有一个更简单的解决方案。 -replace
运算符使用需要转义的正则表达式,但.Replace()
字符串方法只使用字符串。因此,如果您不需要正则表达式,只需使用该方法,就不需要转义任何内容:
dir | rename-item -NewName { $_.name.Replace("(","") }
答案 2 :(得分:4)
Dir | Rename-Item -NewName { $_.name -replace "\(","" } # This works