“(”char在PowerShell中不起作用

时间:2014-02-17 08:24:49

标签: powershell

我无法让这个工作。它不喜欢“(”char;

我该如何解决?

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

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

3 个答案:

答案 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