Files
pxe-server/playbook/shopfloor-setup/gea-shopfloor-cmm/scripts/Backup-CMM.ps1
cproudlock 59deaea714 CMM: Backup-CMM defaults to S: record-retention path + prompts for CMM#
Default output is now S:\2 WJ Scans Record Retention\backup\cmm\<CmmId>\ instead
of C:\Logs. If S: is not mapped/reachable it falls back to C:\Logs\CMM\cmm-backup
so the backup still runs. When -CmmId is not passed the script prompts for it
(loops until non-empty) since it names the per-bay folder.

Smoke tested on the win11 VM: S: fallback path + the Read-Host prompt (fed via
redirected stdin) both produce the correctly-named per-CMM folder.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 15:34:10 -04:00

83 lines
3.5 KiB
PowerShell

<#
Backup-CMM.ps1
ONE backup for a whole CMM bay - runs both:
- Backup-goCMMSettings.ps1 (HKLM goCMM key + C:\geaofi, minus LocalProgramCopies/logs)
- Backup-PCDMISSettings.ps1 (PC-DMIS registry + data/probe/cal + interfac.dll,
every installed version; Homepage state excluded)
All zips land together in one per-CMM folder so they can be staged on PXE and
restored by CMM machine-# at imaging.
Run as ADMINISTRATOR on the live CMM. Do NOT run on DODA bays (handled separately).
Output (default): S:\2 WJ Scans Record Retention\backup\cmm\<CmmId>\
gocmm_backup_<PC>_<ts>.zip
pcdmis_backup_<PC>_<ver>_<ts>.zip (one per PC-DMIS version)
cmm-backup-index.json
If S: is not mapped/reachable, falls back to C:\Logs\CMM\cmm-backup\<CmmId>\.
Params:
-CmmId <id> e.g. CMM3 - names the folder + index. If omitted, the script
PROMPTS for it.
-OutDir <p> base output folder (default the S: record-retention path above)
#>
param(
[string]$CmmId,
[string]$OutDir = 'S:\2 WJ Scans Record Retention\backup\cmm'
)
$ErrorActionPreference = 'Continue'
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$ts = Get-Date -Format 'yyyyMMdd-HHmmss'
# Prompt for the CMM number if not passed. It names the backup folder, so we
# need a real value - loop until non-empty.
if (-not $CmmId) {
while (-not $CmmId) {
$CmmId = (Read-Host "Enter the CMM number for this bay (e.g. CMM3)").Trim()
if (-not $CmmId) { Write-Host " CMM number is required." -ForegroundColor Yellow }
}
}
# Default OutDir is on S: (record retention). If S: is not mapped or that base
# path is unreachable, fall back to a local folder so the backup still runs -
# the operator can copy it up to S: afterward.
$fallback = 'C:\Logs\CMM\cmm-backup'
$baseRoot = Split-Path -Qualifier $OutDir -ErrorAction SilentlyContinue
if ($baseRoot -and -not (Test-Path "$baseRoot\")) {
Write-Host "WARNING: $baseRoot is not reachable (S: not mapped?). Falling back to $fallback" -ForegroundColor Yellow
$OutDir = $fallback
}
$dest = Join-Path $OutDir $CmmId
New-Item -ItemType Directory -Path $dest -Force -ErrorAction SilentlyContinue | Out-Null
$log = Join-Path $dest "cmm-backup-$ts.log"
function Log($m){ Write-Host $m; $m | Out-File -FilePath $log -Append }
Log "================ CMM backup: $CmmId on $env:COMPUTERNAME at $(Get-Date) ================"
foreach ($s in 'Backup-goCMMSettings.ps1','Backup-PCDMISSettings.ps1') {
$p = Join-Path $here $s
if (-not (Test-Path $p)) { Log "MISSING sibling script: $p - skipping"; continue }
Log "---- running $s ----"
try { & $p -OutDir $dest *>&1 | ForEach-Object { Log " $_" } }
catch { Log " ERROR in $s : $($_.Exception.Message)" }
}
# index of what we captured
$zips = Get-ChildItem $dest -Filter '*.zip' -File -ErrorAction SilentlyContinue
[pscustomobject]@{
CmmId = $CmmId
Computer = $env:COMPUTERNAME
Timestamp = (Get-Date -Format o)
goCMM = @($zips | Where-Object { $_.Name -like 'gocmm_backup_*' } | Select-Object -Expand Name)
PCDMIS = @($zips | Where-Object { $_.Name -like 'pcdmis_backup_*' } | Select-Object -Expand Name)
} | ConvertTo-Json | Out-File (Join-Path $dest 'cmm-backup-index.json') -Encoding ascii
Log "================ DONE ================"
Log "Folder: $dest"
$zips | ForEach-Object { Log (" {0} ({1} KB)" -f $_.Name, [math]::Round($_.Length/1KB)) }
Write-Host ""
Write-Host "CMM backup for $CmmId complete:" -ForegroundColor Green
Write-Host " $dest"
$zips | ForEach-Object { Write-Host " $($_.Name)" }