以编程方式编辑文件名以删除前导文本

Programmatically edit file names to remove leading text

我的目录中有各种名称如下所示的文件:

first_file_123456.jpg
5 * second_file_246531 (2).jpg

我想要做的是掌握一个 PowerShell 脚本,它可以获取这些文件并像这样重命名它们:

123456.jpg
246531 (2).jpg

我希望去掉最后一个下划线和它前面的所有文本以重命名我的文件,以便它们可以匹配我的企业资源规划系统中的项目编号。这个系统要老得多(2004 技术)所以从那方面自动化已经过时了。

到目前为止我尝试连接但似乎无法正常工作的如下:

    Get-ChildItem -Recurse -filter *_*  | `
    Foreach-Object {
    $oldName = $_.Name
    $pos = $oldName.LastIndexOf("_")
    $newName = $oldName.Substring($pos + 1)
    if (Test-Path $newName) {
        # This is where I get lost - if it runs into a duplicate file name
        # how can I make the name unique
    }        
    #write-host $_.fullname
    write-host $oldName renamed To: $newName | Out-File renamelog.txt
    #rename-item $_.FullName -NewName $newName
}

我注释掉了实际执行某些操作以查看输出结果的命令。

这是一个使用 LastIndexOfSubstring 方法的简短演示:

$name = "first_file_123456.jpg"
$indexOfLastUnderscore = $name.LastIndexOf("_")
$newName = $name.Substring($indexOfLastUnderscore + 1, $name.Length - $indexOfLastUnderscore - 1)
# $newName now contains "123456.jpg"

这是使用 PowerShell 的 -split 运算符和数组索引的另一种方法:

$name = "first_file_123456.jpg"
$newName = ($name -split '_')[-1]
$newName
# $newName now contains "123456.jpg"

批量重命名:

Get-Childitem -path $startDir -recurse |
    where { ! $_.PSIsContainer } |
    foreach { 
        $newName = Join-Path $_.Directory  ($_.Name -replace '.*_', '');
        Rename-Item $_.FullName $newName;
    };

枚举您的文件,过滤出包含下划线的文件名,然后重命名它们,删除包括最后一个下划线在内的所有内容。

$re = '^.*_'

Get-ChildItem 'C:\some\folder' |
    Where-Object { $_.Name -match $re } |
    Rename-Item -NewName { $_.Name -replace $re }