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

jac*_*b p 0 powershell

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

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

Nehemiah (1).mp3
Nehemiah (2).mp3
Nehemiah (11).mp3
Run Code Online (Sandbox Code Playgroud)

真的,我也希望它们看起来像下面这样:

Nehemiah 01.mp3
Nehemiah 02.mp3
Nehemiah 11.mp3
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的脚本。

Dir | Rename-Item –NewName { $_.name –replace “(“,”” }
Dir *.mp3 | rename-item -newname {  $_.name  -replace " ("," "  }
Run Code Online (Sandbox Code Playgroud)

这些都不起作用。

这是我收到的错误消息。

Rename-Item :参数“NewName”的脚本块输入失败。正则表达式模式 ( 无效。在 line:1 char: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

Mat*_*att 5

正如您在Mathias R Jessen 的评论中所见,-replace支持正则表达式,您需要考虑到这一点。静态方法Escape可以帮助自动转义字符串中的正则表达式元字符,以便在您看到它们时看起来更具可读性和功能。

我确实设法在 MSDN上找到了有关使用[regex]::escape()以下方法转义的字符的内容:

通过将它们替换为转义码来转义最少的一组字符(\、*、+、?、|、{、[、(,)、^、$、.、# 和空格)。这指示正则表达式引擎按字面解释这些字符而不是元字符。

但是,由于您实际上并不需要在这里使用正则表达式,因此我建议您使用 string 方法,.replace()因为它可以在没有额外开销的情况下完成相同的操作。

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

字符填充改变了一些东西。我会在那里选择正则表达式,因为拆分字符串并将它们重新组合在一起要容易得多。

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

感谢PetSerAl 帮助解决此反向引用替换解决方案。