startnet.cmd: replace remaining xcopy calls with robocopy /MT:16

Waxtrace staging already used robocopy (8e1f81b, f95d305) but the
shopfloor-setup baseline, common, _ntlars-backups, type-specific,
pre-install, CMM, and Keyence copies still used xcopy with zero error
visibility. Switch them all to robocopy /E /MT:16 /R:1 /W:1 with
errorlevel-8 warnings so copy failures surface on the WinPE console.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
cproudlock
2026-05-26 09:44:44 -04:00
parent 97b9e58d23
commit 5c3db71879

View File

@@ -400,26 +400,30 @@ mkdir W:\Enrollment\shopfloor-setup 2>NUL
copy /Y "Y:\shopfloor-setup\backup_lockdown.bat" "W:\Enrollment\shopfloor-setup\backup_lockdown.bat" copy /Y "Y:\shopfloor-setup\backup_lockdown.bat" "W:\Enrollment\shopfloor-setup\backup_lockdown.bat"
if exist "Y:\shopfloor-setup\Shopfloor" ( if exist "Y:\shopfloor-setup\Shopfloor" (
mkdir W:\Enrollment\shopfloor-setup\Shopfloor 2>NUL mkdir W:\Enrollment\shopfloor-setup\Shopfloor 2>NUL
xcopy /E /Y /I "Y:\shopfloor-setup\Shopfloor" "W:\Enrollment\shopfloor-setup\Shopfloor\" robocopy "Y:\shopfloor-setup\Shopfloor" "W:\Enrollment\shopfloor-setup\Shopfloor" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: shopfloor-setup\Shopfloor robocopy exit %ERRORLEVEL%
echo Copied Shopfloor baseline setup files. echo Copied Shopfloor baseline setup files.
) )
REM --- Always copy common/ (cross-PC-type GE-Enforce dispatcher + lib live here post-v2) --- REM --- Always copy common/ (cross-PC-type GE-Enforce dispatcher + lib live here post-v2) ---
if exist "Y:\shopfloor-setup\common" ( if exist "Y:\shopfloor-setup\common" (
mkdir W:\Enrollment\shopfloor-setup\common 2>NUL mkdir W:\Enrollment\shopfloor-setup\common 2>NUL
xcopy /E /Y /I "Y:\shopfloor-setup\common" "W:\Enrollment\shopfloor-setup\common\" robocopy "Y:\shopfloor-setup\common" "W:\Enrollment\shopfloor-setup\common" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: shopfloor-setup\common robocopy exit %ERRORLEVEL%
echo Copied common setup files. echo Copied common setup files.
) )
REM --- Copy _ntlars-backups (147 per-bay .reg files restored by gea-shopfloor-{collections,nocollections}\03-RestoreEDncConfig.ps1) --- REM --- Copy _ntlars-backups (147 per-bay .reg files restored by gea-shopfloor-{collections,nocollections}\03-RestoreEDncConfig.ps1) ---
REM Same root level as common/, referenced by 03-RestoreEDncConfig.ps1 via Join-Path $PSScriptRoot '..\_ntlars-backups'. REM Same root level as common/, referenced by 03-RestoreEDncConfig.ps1 via Join-Path $PSScriptRoot '..\_ntlars-backups'.
if exist "Y:\shopfloor-setup\_ntlars-backups" ( if exist "Y:\shopfloor-setup\_ntlars-backups" (
mkdir W:\Enrollment\shopfloor-setup\_ntlars-backups 2>NUL mkdir W:\Enrollment\shopfloor-setup\_ntlars-backups 2>NUL
xcopy /E /Y /I "Y:\shopfloor-setup\_ntlars-backups" "W:\Enrollment\shopfloor-setup\_ntlars-backups\" robocopy "Y:\shopfloor-setup\_ntlars-backups" "W:\Enrollment\shopfloor-setup\_ntlars-backups" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: _ntlars-backups robocopy exit %ERRORLEVEL%
echo Copied _ntlars-backups. echo Copied _ntlars-backups.
) )
REM --- Copy type-specific scripts on top of baseline --- REM --- Copy type-specific scripts on top of baseline ---
if exist "Y:\shopfloor-setup\%PCTYPE%" ( if exist "Y:\shopfloor-setup\%PCTYPE%" (
mkdir "W:\Enrollment\shopfloor-setup\%PCTYPE%" 2>NUL mkdir "W:\Enrollment\shopfloor-setup\%PCTYPE%" 2>NUL
xcopy /E /Y /I "Y:\shopfloor-setup\%PCTYPE%" "W:\Enrollment\shopfloor-setup\%PCTYPE%\" robocopy "Y:\shopfloor-setup\%PCTYPE%" "W:\Enrollment\shopfloor-setup\%PCTYPE%" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: shopfloor-setup\%PCTYPE% robocopy exit %ERRORLEVEL%
echo Copied %PCTYPE% setup files. echo Copied %PCTYPE% setup files.
) else ( ) else (
echo WARNING: No setup files found for PC type %PCTYPE%. echo WARNING: No setup files found for PC type %PCTYPE%.
@@ -431,13 +435,15 @@ if exist "Y:\pre-install\preinstall.json" (
mkdir W:\PreInstall\installers 2>NUL mkdir W:\PreInstall\installers 2>NUL
copy /Y "Y:\pre-install\preinstall.json" "W:\PreInstall\preinstall.json" copy /Y "Y:\pre-install\preinstall.json" "W:\PreInstall\preinstall.json"
if exist "Y:\pre-install\installers" ( if exist "Y:\pre-install\installers" (
xcopy /E /Y /I "Y:\pre-install\installers" "W:\PreInstall\installers\" robocopy "Y:\pre-install\installers" "W:\PreInstall\installers" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: pre-install\installers robocopy exit %ERRORLEVEL%
echo Staged preinstall bundle to W:\PreInstall. echo Staged preinstall bundle to W:\PreInstall.
) else ( ) else (
echo WARNING: Y:\pre-install\installers not found - preinstall.json staged without installers. echo WARNING: Y:\pre-install\installers not found - preinstall.json staged without installers.
) )
if exist "Y:\pre-install\udc-backups" ( if exist "Y:\pre-install\udc-backups" (
xcopy /E /Y /I "Y:\pre-install\udc-backups" "W:\PreInstall\udc-backups\" robocopy "Y:\pre-install\udc-backups" "W:\PreInstall\udc-backups" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: pre-install\udc-backups robocopy exit %ERRORLEVEL%
echo Staged UDC settings backups to W:\PreInstall\udc-backups. echo Staged UDC settings backups to W:\PreInstall\udc-backups.
) )
) else ( ) else (
@@ -454,7 +460,8 @@ REM unified GE-Enforce dispatcher takes over from the share for ongoing updates.
if /i not "%PCTYPE%"=="gea-shopfloor-cmm" goto skip_cmm_stage if /i not "%PCTYPE%"=="gea-shopfloor-cmm" goto skip_cmm_stage
if exist "Y:\installers-post\cmm\cmm-manifest.json" ( if exist "Y:\installers-post\cmm\cmm-manifest.json" (
mkdir W:\CMM-Install 2>NUL mkdir W:\CMM-Install 2>NUL
xcopy /E /Y /I "Y:\installers-post\cmm" "W:\CMM-Install\" robocopy "Y:\installers-post\cmm" "W:\CMM-Install" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: cmm robocopy exit %ERRORLEVEL%
echo Staged CMM bootstrap to W:\CMM-Install. echo Staged CMM bootstrap to W:\CMM-Install.
) else ( ) else (
echo WARNING: Y:\cmm-installers not found - CMM PC cannot install Hexagon apps at imaging time. echo WARNING: Y:\cmm-installers not found - CMM PC cannot install Hexagon apps at imaging time.
@@ -474,7 +481,8 @@ if "%KEYENCEMODEL%"=="" goto skip_keyence_stage
if exist "Y:\installers-post\keyence\%KEYENCEMODEL%\manifest.json" ( if exist "Y:\installers-post\keyence\%KEYENCEMODEL%\manifest.json" (
mkdir W:\KeyenceInstall 2>NUL mkdir W:\KeyenceInstall 2>NUL
mkdir W:\KeyenceInstall\%KEYENCEMODEL% 2>NUL mkdir W:\KeyenceInstall\%KEYENCEMODEL% 2>NUL
xcopy /E /Y /I "Y:\installers-post\keyence\%KEYENCEMODEL%" "W:\KeyenceInstall\%KEYENCEMODEL%\" robocopy "Y:\installers-post\keyence\%KEYENCEMODEL%" "W:\KeyenceInstall\%KEYENCEMODEL%" /E /MT:16 /R:1 /W:1 /NFL /NDL
if errorlevel 8 echo WARNING: keyence\%KEYENCEMODEL% robocopy exit %ERRORLEVEL%
echo Staged Keyence %KEYENCEMODEL% bootstrap to W:\KeyenceInstall\%KEYENCEMODEL%\. echo Staged Keyence %KEYENCEMODEL% bootstrap to W:\KeyenceInstall\%KEYENCEMODEL%\.
) else ( ) else (
echo WARNING: Y:\installers-post\keyence\%KEYENCEMODEL% not found - Keyence %KEYENCEMODEL% cannot install at imaging time. echo WARNING: Y:\installers-post\keyence\%KEYENCEMODEL% not found - Keyence %KEYENCEMODEL% cannot install at imaging time.
@@ -483,11 +491,12 @@ if exist "Y:\installers-post\keyence\%KEYENCEMODEL%\manifest.json" (
REM --- Stage WaxTrace bootstrap bundle (wax/trace gea-shopfloor-waxtrace only) --- REM --- Stage WaxTrace bootstrap bundle (wax/trace gea-shopfloor-waxtrace only) ---
REM Three-step process: REM Three-step process:
REM 1. xcopy installers-post\waxtrace -> W:\WaxTrace-Install (everything REM 1. robocopy installers-post\waxtrace -> W:\WaxTrace-Install (everything
REM EXCEPT the formtracepak\ subdir which carries all 7 version ISOs) REM EXCEPT the formtracepak\ subdir, via /XD - that subdir carries all
REM 7 vendor ISOs and we only need one of them)
REM 2. resolve-bay-config.ps1: reads bay-config.csv + asset_tag, writes REM 2. resolve-bay-config.ps1: reads bay-config.csv + asset_tag, writes
REM W:\Enrollment\waxtrace\{version,model,userid}.txt for 09-Setup to read REM W:\Enrollment\waxtrace\{version,model,userid}.txt for 09-Setup to read
REM 3. xcopy ONLY the bay's matching FORMTRACEPAK-V<ver>.iso from REM 3. robocopy ONLY the bay's matching FORMTRACEPAK-V<ver>.iso from
REM Y:\installers-post\waxtrace\formtracepak\ onto the target disk REM Y:\installers-post\waxtrace\formtracepak\ onto the target disk
REM (so 09-Setup-WaxAndTrace.ps1 mounts the right version per bay) REM (so 09-Setup-WaxAndTrace.ps1 mounts the right version per bay)
if /i not "%PCTYPE%"=="gea-shopfloor-waxtrace" goto skip_waxtrace_stage if /i not "%PCTYPE%"=="gea-shopfloor-waxtrace" goto skip_waxtrace_stage
@@ -510,8 +519,8 @@ if not "%MACHINENUM%"=="" (
) else ( ) else (
echo WARNING: no MACHINENUM set - skipping bay-config resolve. 09-Setup-WaxAndTrace will abort cleanly with no version. echo WARNING: no MACHINENUM set - skipping bay-config resolve. 09-Setup-WaxAndTrace will abort cleanly with no version.
) )
REM Read the resolved version + xcopy ONLY that FTPak ISO (avoids dumping 12 GB REM Read the resolved version + robocopy ONLY that FTPak ISO (avoids dumping
REM of ISOs on the bay disk; only the matched ~2 GB ISO lands locally). REM 12 GB of ISOs on the bay disk; only the matched ~2 GB ISO lands locally).
set WTVER= set WTVER=
if exist W:\Enrollment\waxtrace\version.txt set /p WTVER=<W:\Enrollment\waxtrace\version.txt if exist W:\Enrollment\waxtrace\version.txt set /p WTVER=<W:\Enrollment\waxtrace\version.txt
if not "%WTVER%"=="" ( if not "%WTVER%"=="" (
@@ -527,18 +536,17 @@ if not "%WTVER%"=="" (
) else ( ) else (
echo WARNING: bay-config did not resolve a FTPak version for %MACHINENUM%. echo WARNING: bay-config did not resolve a FTPak version for %MACHINENUM%.
) )
REM Cherry-pick the per-asset backup ZIP (captured from the live bay before REM Per-asset backup ZIPs land at W:\WaxTrace-Install\backups\<asset>.zip
REM re-imaging) into W:\WaxTrace-Install\backup\<asset>.zip. sync-waxtrace.sh REM as part of the robocopy bundle above (backups\ is not in the /XD list).
REM stages one ZIP per asset under installers-post\waxtrace\backups\ named REM 09-Setup-WaxAndTrace.ps1 Step 3b reads C:\WaxTrace-Install\backups\
REM <asset>.zip. 09-Setup-WaxAndTrace.ps1 reads it post-vendor-MSI and runs REM <asset>.zip post-vendor-MSI and runs Install-FormtracepakSettings.ps1
REM Install-FormtracepakSettings.ps1 -RestoreData -RestoreConfig. REM -RestoreData -RestoreConfig. Total ~17 MB on disk for the whole set, no
mkdir W:\WaxTrace-Install\backup 2>NUL REM cherry-pick needed.
if not "%MACHINENUM%"=="" ( if not "%MACHINENUM%"=="" (
if exist "Y:\installers-post\waxtrace\backups\%MACHINENUM%.zip" ( if exist "W:\WaxTrace-Install\backups\%MACHINENUM%.zip" (
xcopy /Y "Y:\installers-post\waxtrace\backups\%MACHINENUM%.zip" "W:\WaxTrace-Install\backup\" echo Backup ZIP %MACHINENUM%.zip is in the bundle - 09-Setup Step 3b will restore.
echo Staged per-asset backup %MACHINENUM%.zip for restore.
) else ( ) else (
echo INFO: No backup ZIP for %MACHINENUM% on share - 09-Setup will skip the restore step. echo INFO: No backup ZIP for %MACHINENUM% in W:\WaxTrace-Install\backups - 09-Setup will skip the restore step.
) )
) )
goto skip_waxtrace_stage goto skip_waxtrace_stage