背景
Creo 在构建模型时,如果发生修改并完成保存时会创建新的 .prt 或者 .asm 文件,命名会以数字结尾;随着时间的推移,这类文件会越来越多,如果模型已经定性定型,那么这些旧版本文件就可以删除了
实现
已在 Window11 x64 完成测试
- 实现了对旧版本文件的删除
- 实现了对删除的文件使用 zip 备份
- 完善的 log 输出,方便确认执行结果
- 支持仅作 log 输出,只需要删除下面快捷方式中出现的
-Delete
字样即可 - 支持将删除文件的详细信息整合到 zip 备份,方便对照查阅和审计
- 支持通过构建多个快捷方式处理更多的 Creo 工作目录
<#
CreoOldVersionsHandler.ps1
- 参数:
-WorkDir <string> (必填) 要扫描的工作目录
-Delete (可选) 启用后会删除旧版本(先打包备份)
- 行为:
1) 递归扫描 WorkDir,识别形如 name.prt.N / name.asm.N 的版本文件
2) 为每个 base (按目录) 保留最大版本,记录其余为“计划删除”
3) 若启用 -Delete,则:
a) 在 WorkDir 下创建备份 zip (含所有待删文件 + 一份扫描快照 log)
b) 备份成功后逐个删除这些旧文件,并把删除结果追加到 cleanup_log.txt
4) 始终生成并打开 cleanup_log.txt(包含扫描与操作摘要)
#>
param(
[Parameter(Mandatory = $true)]
[string]$WorkDir,
[switch]$Delete
)
# 兼容性:确保工作目录存在
Try {
Set-Location -Path $WorkDir -ErrorAction Stop
} Catch {
Write-Error "路径不存在或无法访问: $WorkDir"
exit 1
}
# 日志文件路径
$LogFile = Join-Path $WorkDir "cleanup_log.txt"
# 新建/覆盖日志
"" | Out-File -FilePath $LogFile -Encoding UTF8 -Force
Write-Host "扫描路径: $WorkDir"
Write-Host "模式: 递归子目录"
Write-Host "日志: $LogFile"
Write-Host ""
# 获取所有文件并过滤出 name.prt.N / name.asm.N
$all = Get-ChildItem -Path $WorkDir -File -Recurse -ErrorAction SilentlyContinue
$matches = $all |
Where-Object { $_.Name -match '\.(prt|asm)\.\d+$' } |
ForEach-Object {
if ($_.Name -match '^(?<base>.+)\.(?<type>prt|asm)\.(?<ver>\d+)$') {
[PSCustomObject]@{
FullName = $_.Name
FullPath = $_.FullName
Directory = $_.DirectoryName
BaseName = $Matches['base']
Type = $Matches['type']
Version = [int]$Matches['ver']
}
}
}
$totalFiles = $matches.Count
Write-Host "匹配到的文件数: $totalFiles"
if ($totalFiles -eq 0) {
Add-Content -Path $LogFile -Value "未找到任何格式为 *.prt.<num> 或 *.asm.<num> 的文件。"
Write-Host "未找到匹配文件,日志已写入。"
Invoke-Item $LogFile
exit 0
}
# 为每个目录+basename+type 分组
$itemsWithKey = $matches | ForEach-Object {
$_ | Add-Member -NotePropertyName GroupKey -NotePropertyValue (Join-Path $_.Directory ("$($_.BaseName).$($_.Type)")) -PassThru
}
$groups = $itemsWithKey | Group-Object -Property GroupKey
# 全局收集所有待删除文件(使用数组,后面去重)
$allToRemove = @()
# 扫描并记录“计划删除”
foreach ($g in $groups) {
$list = $g.Group | Sort-Object -Property Version -Descending
$keep = $list[0]
$remove = if ($list.Count -gt 1) { $list | Select-Object -Skip 1 } else { @() }
Add-Content $LogFile "------------------------------"
Add-Content $LogFile ("目录: {0}" -f (Split-Path $keep.FullPath -Parent))
Add-Content $LogFile ("文件基名: {0}.{1}" -f $keep.BaseName, $keep.Type)
Add-Content $LogFile ("最大版本: {0}" -f $keep.Version)
Add-Content $LogFile ("保留: {0}" -f $keep.FullName)
Add-Content $LogFile "计划删除:"
if ($remove.Count -gt 0) {
foreach ($r in $remove) {
Add-Content $LogFile (" {0}" -f $r.FullPath)
$allToRemove += $r.FullPath
}
} else {
Add-Content $LogFile " (无旧版本)"
}
}
# 去重待删除列表(避免重复)
if ($allToRemove.Count -gt 0) {
$allToRemove = $allToRemove | Sort-Object -Unique
}
# 执行删除(如果需要)——先统一备份 zip(包含所有待删文件 + 一份扫描快照)
$backupFile = $null
if ($Delete -and $allToRemove.Count -gt 0) {
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupFile = Join-Path $WorkDir ("CreoBackup_$timestamp.zip")
$snapshotLog = Join-Path $WorkDir ("cleanup_log_snapshot_$timestamp.txt")
# 复制当前 log 至 snapshot(用于放入 zip)
Try {
Copy-Item -LiteralPath $LogFile -Destination $snapshotLog -Force -ErrorAction Stop
} Catch {
Add-Content $LogFile ("[WARN] 无法创建 log 副本: {0}" -f $_.Exception.Message)
# 但继续尝试压缩(不包含快照)
$snapshotLog = $null
}
# 准备要压缩的条目(文件 + snapshot log if exist)
$itemsToZip = @()
$itemsToZip += $allToRemove
if ($snapshotLog) { $itemsToZip += $snapshotLog }
Try {
Compress-Archive -Path $itemsToZip -DestinationPath $backupFile -Force -ErrorAction Stop
Add-Content $LogFile ("已统一备份旧版本到: {0}" -f $backupFile)
} Catch {
Add-Content $LogFile ("备份失败: {0}" -f $_.Exception.Message)
# 出错了不执行删除以免丢数据
Add-Content $LogFile "[ERROR] 备份失败,已取消删除操作以防数据丢失。"
$backupFile = $null
# 打开 log 并退出
Invoke-Item $LogFile
exit 1
}
# 若备份成功,开始删除并记录结果
foreach ($f in $allToRemove) {
Try {
Remove-Item -LiteralPath $f -ErrorAction Stop
Add-Content $LogFile ("已删除: {0}" -f $f)
} Catch {
Add-Content $LogFile ("删除失败: {0} 错误: {1}" -f $f, $_.Exception.Message)
}
}
# 删除 snapshot(可选),保持工作目录整洁
if ($snapshotLog -and (Test-Path $snapshotLog)) {
Try { Remove-Item -LiteralPath $snapshotLog -ErrorAction SilentlyContinue } Catch {}
}
}
# 日志汇总
Add-Content $LogFile ""
Add-Content $LogFile ("扫描时间: {0}" -f (Get-Date))
Add-Content $LogFile ("匹配到的文件总数: {0}" -f $totalFiles)
Add-Content $LogFile ("分组数(不同文件基名): {0}" -f $groups.Count)
$deleteStatus = if ($Delete) { "执行" } else { "未执行" }
Add-Content $LogFile ("删除操作已{0}" -f $deleteStatus)
if ($backupFile) { Add-Content $LogFile ("备份文件: {0}" -f $backupFile) }
Write-Host ""
Write-Host "扫描完成。日志已生成: $LogFile"
if ($Delete) {
if ($backupFile) {
Write-Host "已备份并删除旧版本(详情见日志)"
} else {
Write-Host "尝试删除时发生错误,已取消删除。请检查日志。"
}
} else {
Write-Host "未执行删除操作,仅生成日志"
}
# 打开日志以便查看
Invoke-Item $LogFile
快速开始:
- 将代码保存为 CreoOldVersionsHandler.ps1
- 在桌面右键生成快捷方式,填入如下代码(仅供参考):
powershell.exe -ExecutionPolicy Bypass -File "D:\AppData\CreoOldVersionsHandler.ps1" -WorkDir "D:\AppData\Solid ElecValue" -Delete
- 执行此快捷方式(如果被拦截请放行)
请注意上面快捷方式内容仅供参考,在你的电脑上使用时,请做如下修正:
-
D:\AppData\CreoOldVersionsHandler.ps1
请改为你的 CreoOldVersionsHandler.ps1 存储的位置。 -
D:\AppData\Solid ElecValue
请改为你的 Creo 工作目录 - 你可以通过构建多个快捷方式来处理多个 Creo 工作目录
执行结果
代码会将需要保留的文件,删除的文件以及备份进行罗列,如图所示(仅供参考)
友情提示:数据宝贵,请务必再确认脚本能够正常使用前做好备份。
版权所有,转载请注明出处