尝试在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()