PTC Creo 旧版本工程文件删除工具(PowerShell 版本)

背景

Creo 在构建模型时,如果发生修改并完成保存时会创建新的 .prt 或者 .asm 文件,命名会以数字结尾;随着时间的推移,这类文件会越来越多,如果模型已经定性定型,那么这些旧版本文件就可以删除了

实现

已在 Window11 x64 完成测试

  1. 实现了对旧版本文件的删除
  2. 实现了对删除的文件使用 zip 备份
  3. 完善的 log 输出,方便确认执行结果
  4. 支持仅作 log 输出,只需要删除下面快捷方式中出现的 -Delete 字样即可
  5. 支持将删除文件的详细信息整合到 zip 备份,方便对照查阅和审计
  6. 支持通过构建多个快捷方式处理更多的 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

快速开始:

  1. 将代码保存为 CreoOldVersionsHandler.ps1
  2. 在桌面右键生成快捷方式,填入如下代码(仅供参考):
powershell.exe -ExecutionPolicy Bypass -File "D:\AppData\CreoOldVersionsHandler.ps1" -WorkDir "D:\AppData\Solid ElecValue" -Delete
  1. 执行此快捷方式(如果被拦截请放行)

请注意上面快捷方式内容仅供参考,在你的电脑上使用时,请做如下修正:

  1. D:\AppData\CreoOldVersionsHandler.ps1 请改为你的 CreoOldVersionsHandler.ps1 存储的位置。
  2. D:\AppData\Solid ElecValue 请改为你的 Creo 工作目录
  3. 你可以通过构建多个快捷方式来处理多个 Creo 工作目录

执行结果

代码会将需要保留的文件,删除的文件以及备份进行罗列,如图所示(仅供参考)


友情提示:数据宝贵,请务必再确认脚本能够正常使用前做好备份。

版权所有,转载请注明出处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容