首页 文章

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

提问于
浏览
-1

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

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

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 char:34 Dir * .mp3 | rename-item -newname {$ _ . name -replace“(”,“”} ~~~~~~~~~~ 〜:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ndingException FullyQualifiedErrorId:ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.RenameItemCommand

3 回答

  • 3

    正如您在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

    试试这个 .

    ls | Where {$_.FullName -match '(-)'} | Rename-Item -NewName { $_ -replace ("-","_") }
    

    我列出了匹配(包含)破折号 - 的目录中的每个文件,然后我将其输入到 Rename-Item ,用 new-name 替换 - 作为下划线 _

    PS:奖金是,我可以迅速从下划线中取回破折号 .

  • 0

    我确信这可以用更简单的方式完成,但它对我有用 .

    [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 数组,可以更轻松地对其进行操作 .

    这样不仅可以删除括号,还可以填充您的单位数字 .

相关问题