尝试在PowerShell中更改文件名时出错

尝试在PowerShell中更改文件名时出错,powershell,Powershell,我在网上找到了类似的命令。我想将文件名中的括号替换为空格或空字符串 我试图更改的文件如下所示: Nehemiah (1).mp3 Nehemiah (2).mp3 Nehemiah (11).mp3 Nehemiah 01.mp3 Nehemiah 02.mp3 Nehemiah 11.mp3 真的,我也希望它们看起来像这样: Nehemiah (1).mp3 Nehemiah (2).mp3 Nehemiah (11).mp3 Nehemiah 01.mp3 Nehemiah 02.mp

我在网上找到了类似的命令。我想将文件名中的括号替换为空格或空字符串

我试图更改的文件如下所示:

Nehemiah (1).mp3
Nehemiah (2).mp3
Nehemiah (11).mp3
Nehemiah 01.mp3
Nehemiah 02.mp3
Nehemiah 11.mp3
真的,我也希望它们看起来像这样:

Nehemiah (1).mp3
Nehemiah (2).mp3
Nehemiah (11).mp3
Nehemiah 01.mp3
Nehemiah 02.mp3
Nehemiah 11.mp3
以下是我尝试过的脚本

Dir | Rename-Item –NewName { $_.name –replace “(“,”” }
Dir *.mp3 | rename-item -newname {  $_.name  -replace " ("," "  }
这两种方法都不管用

这是我收到的错误消息

重命名项:参数“NewName”的脚本块输入 失败。正则表达式模式(在第1行)无效 字符:34 +Dir*.mp3 | rename item-newname{$|.name-replace“(“,”} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidArgument:(C:\Users…ehemiah(1).mp3:PSObject)[重命名项],参数ndingException +FullyQualifiedErrorId:ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.RenameItemCommand

试试这个

ls | Where {$_.FullName -match '(-)'} | Rename-Item -NewName { $_ -replace ("-","_") }
我列出目录中与破折号匹配(包含)的每个文件
-
,然后我将其导入
重命名项
,并使用
新名称
替换下划线
-

附言:好处是,我可以很快地从下划线中放回破折号。

试试这个

ls | Where {$_.FullName -match '(-)'} | Rename-Item -NewName { $_ -replace ("-","_") }
我列出目录中与破折号匹配(包含)的每个文件
-
,然后我将其导入
重命名项
,并使用
新名称
替换下划线
-


PS:好处是,我可以很快地从下划线中放回破折号。

正如您在
的注释中所看到的那样-replace
支持正则表达式,您需要考虑这一点。静态方法
Escape
可以帮助在字符串中自动转义正则表达式元字符,以便让字符串看起来更可读、更有趣就像你看到的那样

我确实找到了关于使用
[regex]::escape()
:

通过用转义码替换最小字符集(\、*、+、?、|、{、[、(、)、^、$、#和空格),对其进行转义。这指示正则表达式引擎按字面解释这些字符,而不是将其作为元字符

然而,由于您实际上不需要在这里使用regex,我建议您使用string方法
.replace()
,因为这样做不会产生额外的开销

Get-ChildItem "*.mp3" | Rename-Item -NewName {($_.name).Replace(" ("," ")}

不过,字符填充会改变一些事情。我会在这里为regex操作,因为拆分字符串并将它们重新组合起来要容易得多

Get-ChildItem "*.mp3" | 
    Where-Object{$_.name -match "\((\d+)\)"}
    Rename-Item -NewName {
        [regex]::Replace($_.Name,"\((\d+)\)",{param($match) ($match.Groups[1].Value).PadLeft(2,"0")})
    }

多亏了这个解决方案。

正如您在
-replace
的注释中所看到的那样,replace支持正则表达式,您需要对此进行说明。静态方法
Escape
可以帮助自动转义字符串中的正则表达式元字符,使其看起来更具可读性,并且可以像您看到的那样发挥作用

我确实找到了关于使用
[regex]::escape()
:

通过用转义码替换最小字符集(\、*、+、?、|、{、[、(、)、^、$、#和空格),对其进行转义。这指示正则表达式引擎按字面解释这些字符,而不是将其作为元字符

然而,由于您实际上不需要在这里使用regex,我建议您使用string方法
.replace()
,因为这样做不会产生额外的开销

Get-ChildItem "*.mp3" | Rename-Item -NewName {($_.name).Replace(" ("," ")}

不过,字符填充会改变一些事情。我会在这里为regex操作,因为拆分字符串并将它们重新组合起来要容易得多

Get-ChildItem "*.mp3" | 
    Where-Object{$_.name -match "\((\d+)\)"}
    Rename-Item -NewName {
        [regex]::Replace($_.Name,"\((\d+)\)",{param($match) ($match.Groups[1].Value).PadLeft(2,"0")})
    }

多亏了这个解决方案。

我相信这可能可以用一种更简单的方式来完成,但它对我来说很有用

[regex]$rxp='\(\d+)';gci |?{$\.Name-match$rxp}{ren$\.FullName($\.Name-replace$rxp,$matches[1].padLeft(2,'0'))}
下面是一个细分:

#定义正则表达式。外圆括号为文字。内圆括号为
#捕获组,捕获文件名中的曲目编号。
[regex]$rxp='\(\d+)\'
#获取子项。对于与正则表达式匹配的每个子项。。。
gci |?{$|.Name-匹配$rxp}|%{
#重命名该文件,将有问题的正则表达式匹配项替换为匹配项
#从where对象选择器(模块)获取
ren$\.FullName($\.name-replace$rxp,$matches[1].padLeft(2,'0'))
}
PowerShell无法轻松处理由反向引用捕获的数据。但是,
-match
运算符填充一个
$matches
数组,该数组可以更轻松地进行操作


这不仅可以删除括号,还可以将单个数字归零。

我相信这可能可以用一种更简单的方式完成,但对我来说是可行的

[regex]$rxp='\(\d+)';gci |?{$\.Name-match$rxp}{ren$\.FullName($\.Name-replace$rxp,$matches[1].padLeft(2,'0'))}
下面是一个细分:

#定义正则表达式。外圆括号为文字。内圆括号为
#捕获组,捕获文件名中的曲目编号。
[regex]$rxp='\(\d+)\'
#获取子项。对于与正则表达式匹配的每个子项。。。
gci |?{$|.Name-匹配$rxp}|%{
#重命名该文件,将有问题的正则表达式匹配项替换为匹配项
#从where对象选择器(模块)获取
ren$\.FullName($\.name-replace$rxp,$matches[1].padLeft(2,'0'))
}
PowerShell无法轻松处理由反向引用捕获的数据。但是,
-match
运算符填充一个
$matches
数组,该数组可以更轻松地进行操作


这不仅可以删除括号,还可以将单个数字归零。

-replace
需要正则表达式模式,您需要转义
-replace[regex]::escape()