我在目录中有各种名称如下的文件:
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
}
我注释掉了实际做某事的命令,看看输出是什么。
答案 0 :(得分:2)
枚举您的文件,过滤包含下划线的文件名,然后使用所有内容重命名它们,包括删除的最后一个下划线。
$re = '^.*_'
Get-ChildItem 'C:\some\folder' |
Where-Object { $_.Name -match $re } |
Rename-Item -NewName { $_.Name -replace $re }
答案 1 :(得分:1)
这是一个使用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"
答案 2 :(得分:1)
批量重命名:
Get-Childitem -path $startDir -recurse |
where { ! $_.PSIsContainer } |
foreach {
$newName = Join-Path $_.Directory ($_.Name -replace '.*_', '');
Rename-Item $_.FullName $newName;
};