我在网上发现了类似的命令。我想将文件名中的括号替换为空格或空字符串。
我尝试更改的文件如下所示:
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 " ("," " }
这些都不起作用。
以下是我收到的错误消息。
Rename-Item:参数' NewName'的脚本块的输入。 失败。正则表达式模式(无效。在行:1 炭:34 + Dir * .mp3 | rename-item -newname {$ _。name -replace" (",""} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(C:\ Users ... ehemiah(1).mp3:PSObject)[Rename-Item],参数ndingException + FullyQualifiedErrorId:ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.RenameItemCommand
答案 0 :(得分:4)
正如您在Mathias R Jessen -replace
的评论中看到的那样,支持正则表达式,您需要考虑到这一点。静态方法Escape
可以帮助自动转义字符串中的正则表达式元字符,以便在您看到它们时看起来更具可读性和功能。
我确实设法找到this on MSDN,其中讨论了使用[regex]::escape()
转义的字符:
通过将其替换为转义码来转义一组最小字符(\,*,+,?,|,{,[,(,),^,$ ,.,#和空格)。这指示正则表达式引擎按字面解释这些字符而不是元字符。
但是,由于您实际上并不需要在这里使用正则表达式,我建议您使用字符串方法.replace()
,因为这样可以完成相同的操作而无需额外的开销。
Get-ChildItem "*.mp3" | Rename-Item -NewName {($_.name).Replace(" ("," ")}
字符填充会改变一些事情。我会在那里使用正则表达式,因为分割字符串并将它们重新组合起来要容易得多。
Get-ChildItem "*.mp3" |
Where-Object{$_.name -match "\((\d+)\)"}
Rename-Item -NewName {
[regex]::Replace($_.Name,"\((\d+)\)",{param($match) ($match.Groups[1].Value).PadLeft(2,"0")})
}
感谢PetSerAl for helping with this backreference replacement解决方案。
答案 1 :(得分:1)
我确信这可以用更简单的方式完成,但它对我有用。
[regex]$rxp = '\((\d+)\)'; gci | ?{$_.Name -match $rxp} | %{ ren $_.FullName ($_.name -replace $rxp, $matches[1].padLeft(2,'0')) }
以下是细分:
# Define regex. The outer parentheses are literal. The inner are a
# capture group, capturing the track number in the filename.
[regex]$rxp = '\((\d+)\)'
# Get-ChildItems. For each child item that matches the regex...
gci | ?{$_.Name -match $rxp} | %{
# Rename the file, replacing the offending regex match with the match
# obtained from the where-object selector (the ? block)
ren $_.FullName ($_.name -replace $rxp, $matches[1].padLeft(2,'0'))
}
PowerShell无法轻松按下反向引用捕获的数据。但是,-match
运算符会填充$matches
数组,可以更轻松地对其进行操作。
这样不仅可以删除括号,还可以填充您的一位数字。
答案 2 :(得分:0)
试试这个。
ls | Where {$_.FullName -match '(-)'} | Rename-Item -NewName { $_ -replace ("-","_") }
我列出了匹配(包含)短划线-
的目录中的每个文件,然后将其导入Rename-Item
并new-name
替换-
作为下划线_
PS:奖金是,我可以快速退回下划线的短划线。