<# 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\\ gocmm_backup__.zip pcdmis_backup___.zip (one per PC-DMIS version) cmm-backup-index.json If S: is not mapped/reachable, falls back to C:\Logs\CMM\cmm-backup\\. Params: -CmmId e.g. CMM3 - names the folder + index. If omitted, the script PROMPTS for it. -OutDir

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)" }