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

时间:2016-01-16 02:19:45

标签: powershell

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

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

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

3 个答案:

答案 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-Itemnew-name替换-作为下划线_

PS:奖金是,我可以快速退回下划线的短划线。