From f570e9284734453efaf6016421dd5fe658aae976 Mon Sep 17 00:00:00 2001 From: cproudlock Date: Mon, 1 Jun 2026 16:21:39 -0400 Subject: [PATCH] startnet: robocopy (fail-fast) for staging copies so a stalled Y: cannot hang imaging A Display bay staged only site-config.json then nothing - winpe-staging.log ended at 'Copied site-config.json'. PCTYPE/PPKG were both set, so it was not a menu bug: execution froze at the very next step, the PPKG copy copy /Y Y:\ppkgs\... W:\Enrollment\... A bare 'copy' from a network drive has no timeout; when the Y: SMB handle stalled it blocked forever, so pc-type.txt / shopfloor-setup / preinstall never ran (Display kiosk + Common OpenText both depend on the preinstall phase). Convert every bare 'copy /Y' in the staging path to 'robocopy /R:1 /W:1' (fail-fast retry, no overwrite/dir prompts). robocopy exit codes are inverse of copy (0-7 ok, 8+ fail) so the PPKG check flips to errorlevel 8, and since robocopy keeps the source name the PPKG gets a ren to its BPRT-tagged target. A stalled share now fails one step and continues instead of freezing the whole stage. Co-Authored-By: Claude Opus 4.8 (1M context) --- playbook/startnet.cmd | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/playbook/startnet.cmd b/playbook/startnet.cmd index 677fa17..d98e051 100644 --- a/playbook/startnet.cmd +++ b/playbook/startnet.cmd @@ -371,7 +371,7 @@ echo PCTYPE=%PCTYPE% PPKG=%PPKG% MACHINENUM=%MACHINENUM% CMMID=%CMMID% >> "%STAG REM --- Copy site config (drives site-specific values in all setup scripts) --- if exist "Y:\config\site-config.json" ( - copy /Y "Y:\config\site-config.json" "W:\Enrollment\site-config.json" + robocopy "Y:\config" "W:\Enrollment" "site-config.json" /R:1 /W:1 /NFL /NDL /NJH /NJS echo Copied site-config.json. echo [%TIME%] Copied site-config.json >> "%STAGELOG%" ) else ( @@ -381,16 +381,17 @@ if exist "Y:\config\site-config.json" ( REM --- Copy PPKG if selected (renames from SOURCE to BPRT-tagged filename) --- if "%PPKG%"=="" goto copy_pctype -copy /Y "Y:\ppkgs\%SOURCE_PPKG%" "W:\Enrollment\%PPKG%" -if errorlevel 1 ( +robocopy "Y:\ppkgs" "W:\Enrollment" "%SOURCE_PPKG%" /R:1 /W:1 /NFL /NDL /NJH /NJS +REM robocopy exit codes: 0-7 = success, 8+ = failure (inverse of copy's 0/1). +if errorlevel 8 ( echo WARNING: Failed to copy enrollment package. echo [%TIME%] WARNING: Failed to copy PPKG %SOURCE_PPKG% >> "%STAGELOG%" goto copy_pctype ) +REM robocopy keeps the source name; rename to the BPRT-tagged target name. +if not "%SOURCE_PPKG%"=="%PPKG%" ren "W:\Enrollment\%SOURCE_PPKG%" "%PPKG%" echo [%TIME%] Copied PPKG %SOURCE_PPKG% as %PPKG% >> "%STAGELOG%" -copy /Y "Y:\scripts\run-enrollment.ps1" "W:\Enrollment\run-enrollment.ps1" -copy /Y "Y:\scripts\wait-for-internet.ps1" "W:\Enrollment\wait-for-internet.ps1" -copy /Y "Y:\scripts\migrate-to-wifi.ps1" "W:\Enrollment\migrate-to-wifi.ps1" +robocopy "Y:\scripts" "W:\Enrollment" "run-enrollment.ps1" "wait-for-internet.ps1" "migrate-to-wifi.ps1" /R:1 /W:1 /NFL /NDL /NJH /NJS echo [%TIME%] Copied enrollment scripts >> "%STAGELOG%" REM --- Create enroll.cmd at drive root as manual fallback --- @@ -439,10 +440,10 @@ if not exist W:\Enrollment\cmm\doda.txt goto cmm_id_done set /p CMMDODA= W:\Enrollment\pc-subtype.txt :cmm_id_done -copy /Y "Y:\shopfloor-setup\Run-ShopfloorSetup.ps1" "W:\Enrollment\Run-ShopfloorSetup.ps1" +robocopy "Y:\shopfloor-setup" "W:\Enrollment" "Run-ShopfloorSetup.ps1" /R:1 /W:1 /NFL /NDL /NJH /NJS REM --- Always copy Shopfloor baseline scripts --- mkdir W:\Enrollment\shopfloor-setup 2>NUL -copy /Y "Y:\shopfloor-setup\backup_lockdown.bat" "W:\Enrollment\shopfloor-setup\backup_lockdown.bat" +robocopy "Y:\shopfloor-setup" "W:\Enrollment\shopfloor-setup" "backup_lockdown.bat" /R:1 /W:1 /NFL /NDL /NJH /NJS if exist "Y:\shopfloor-setup\Shopfloor" ( mkdir W:\Enrollment\shopfloor-setup\Shopfloor 2>NUL robocopy "Y:\shopfloor-setup\Shopfloor" "W:\Enrollment\shopfloor-setup\Shopfloor" /E /MT:16 /R:1 /W:1 /NFL /NDL /LOG+:"%STAGELOG%" @@ -483,7 +484,7 @@ REM --- Stage preinstall bundle (apps installed locally to save Azure bandwidth) if exist "Y:\pre-install\preinstall.json" ( mkdir W:\PreInstall 2>NUL mkdir W:\PreInstall\installers 2>NUL - copy /Y "Y:\pre-install\preinstall.json" "W:\PreInstall\preinstall.json" + robocopy "Y:\pre-install" "W:\PreInstall" "preinstall.json" /R:1 /W:1 /NFL /NDL /NJH /NJS if exist "Y:\pre-install\installers" ( robocopy "Y:\pre-install\installers" "W:\PreInstall\installers" /E /MT:16 /R:1 /W:1 /NFL /NDL /LOG+:"%STAGELOG%" if errorlevel 8 echo WARNING: pre-install\installers robocopy exit %ERRORLEVEL%