以编程方式编辑文件名以删除前导文本
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
}
我注释掉了实际执行某些操作以查看输出结果的命令。
这是一个使用 LastIndexOf
和 Substring
方法的简短演示:
$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 }
我的目录中有各种名称如下所示的文件:
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
}
我注释掉了实际执行某些操作以查看输出结果的命令。
这是一个使用 LastIndexOf
和 Substring
方法的简短演示:
$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 }