PowerShell脚本无法正确识别最新修订版本问题咨询
问题排查与修复:PowerShell脚本无法正确识别多位数修订号
问题现象
原脚本用于将格式为“图纸编号_修订号.pdf”的文件最新版本复制到“Latest Drawings”子文件夹,但在多位数修订号场景下识别错误:
- 案例1:文件
AE1.101A_1.pdf、AE1.101A_2.pdf、AE1.101A_3.pdf、AE1.101A_4.pdf、AE1.101A_25.pdf,脚本选中AE1.101A_4.pdf而非AE1.101A_25.pdf - 案例2:文件
GI0-503_REL 35.pdf、GI0-503_REL 36.pdf、GI0-503_REL 41.pdf、GI0-503_REL 210.pdf,脚本选中GI0-503_REL 41.pdf而非GI0-503_REL 210.pdf - 案例3:文件
GI0-503_REL 35.pdf、GI0-503_REL 36.pdf、GI0-503_REL 41.pdf、GI0-503_REL 310.pdf,脚本选中GI0-503_REL 41.pdf而非GI0-503_REL 310.pdf
错误原因
- 字符串比较而非数值比较:原脚本直接用字符串类型的修订号和数值类型的
$latestRevisionNo比较,PowerShell会自动将数值转为字符串按字符逐个对比,例如"4"的首字符"4"大于"25"的首字符"2",导致判断错误。 - 修订号提取不彻底:对于带前缀的修订号(如
REL 210),原脚本提取的是包含前缀的完整字符串,无法直接用于正确的数值比较。
修复后的脚本
#----------------------------------------------------------------------# param( [STRING]$path = $PSScriptRoot ) # 设置源文件夹和目标文件夹 $srcFolder = $path $destFolder = Join-Path -Path $srcFolder -ChildPath "Latest Drawings" # 确保目标文件夹存在 if (-not (Test-Path -Path $destFolder)) { New-Item -Path $destFolder -ItemType Directory | Out-Null } # 获取所有符合格式的文件,并按图纸编号分组 $files = Get-ChildItem -Path $srcFolder -Filter "*_*.*" -File $fileGroups = $files | Group-Object -Property { $_.Name.Split('_')[0] } foreach ($group in $fileGroups) { $drawingNumber = $group.Name $latestRevisionFile = $null $highestRevision = 0 foreach ($file in $group.Group) { # 提取修订号部分,并从中筛选出数字 $revisionPart = $file.Name.Split('_')[1].Split('.')[0] # 提取字符串中的所有数字,转换为整数 if ($revisionPart -match '\d+') { $revisionNumber = [int]$matches[0] # 比较数值大小 if ($revisionNumber -gt $highestRevision) { $highestRevision = $revisionNumber $latestRevisionFile = $file } } } # 复制最新版本文件 if ($latestRevisionFile) { Copy-Item -Path $latestRevisionFile.FullName -Destination $destFolder -Force } } #----------------------------------------------------------------------#
关键修改说明
- 按图纸编号分组处理:使用
Group-Object直接按图纸编号分组,避免原脚本重复遍历所有文件的冗余操作,提升执行效率。 - 提取修订号中的纯数字:通过正则表达式
\d+提取修订号部分中的数字,忽略前缀内容,确保仅对数字进行数值比较。 - 数值比较修订号:将提取的数字转为
int类型,直接进行数值大小对比,彻底解决字符串比较的逻辑错误。 - 提前创建目标文件夹:将目标文件夹的创建逻辑移到循环外,避免每次循环重复检查路径,优化执行流程。
内容的提问来源于stack exchange,提问作者Zachary Alexander
相关产品推荐
相关产品推荐

