使用powershell按顺序重命名pdf文件

Renaming pdf files in sequential order using powershell

我有大量 pdf 需要按顺序重命名。这些最初被扫描成一个文档,然后提取为单独的文件。提取后,名称变为“444026-444050 1”、“444026-444050 2”等。我试图重命名所有文件以匹配文档编号(“444026-444050 1”将变为“444026”)。

我找到了可以在 Powershell 中使用的以下代码行,但是似乎超过 9 个文件就有问题了!一旦我尝试使用 10 个文件,只有第一个文件被正确保存。其余的变得混乱(文件 444027 有文件 444035 的内容,然后文件 444028 有 444027,444029 有 444028,等等)

我想循环有某种问题,但我很难修复它。

有人可以帮忙吗? 谢谢

Dir *.pdf | ForEach-Object  -begin { $count=26 }  -process { rename-item $_ -NewName "4440$count.pdf"; $count++ }

似乎不​​能严格保证 Dir(Get-ChildItem 的别名)检索项目的顺序。此外,如果它正在排序,它可能会将它们排序为字符串,并且“444026-444050 10”作为字符串出现在“444026-444050 2”之前。可能值得将 SortObject 插入您的管道并使用 Split 获取您关心的序列号:

Dir *.pdf | Sort-Object -Property {[int]$_.Name.Split()[1].Split(".")[0]} | ForEach-Object  -begin { $count=26 } -process { rename-item $_ -NewName "4440$count.pdf"; $count++ }

关键部分是在 Dir 之后和 ForEach-Object 之前插入的新管道阶段:

Sort-Object -Property {[int]$_.Name.Split()[1].Split(".")[0]}

这表示根据第一个 space 和后续期间之间的任何内容对 Dir 的输出进行排序,将这些内容作为整数(而不是字符串)进行比较。这确保您的结果将被排序,并且您将按照数字顺序而不是字典顺序获得它们。

好的。让我们看看这是否让每个人都开心。也许你应该用文件的备份副本试试这个。

# make some test files in a new folder
# 1..20 | foreach {
#   if (! (test-path "44026-44050 $_.pdf")) { 
#     echo "44026-44050 $_" > "44026-44050 $_.pdf" }
# }

# rename and pad the first 9 old filenames with a 0 before the last digit for sorting
# is it less than 100 files?
1..9 | foreach {
  ren "44026-44050 $_.pdf" "44026-44050 0$_.pdf" -whatif
}

# make dir complete first with parentheses for powershell 5
# pad $count to 2 digits
# take off the -whatif if it looks ok
(dir *.pdf) | foreach { $count = 1 } {
    $padded = $count | foreach tostring 00
    rename-item $_ -newname 4440$padded.pdf -whatif; $count++ }