FlatUnattendW10-shopfloor.xml was rejected by Windows OOBE with
"the answer file is invalid" after the earlier tower-no-WiFi fix.
Root cause: the inline PowerShell in <CommandLine> for Orders 4 and
5 exceeded the SynchronousCommand CommandLine length limit (~1024
chars) and/or contained characters the unattend schema validator
dislikes.
Fix: move the logic to two external PS1 scripts and shrink both
CommandLine entries to ~85 chars each that just invoke the scripts.
- playbook/wait-for-internet.ps1: 60s interactive prompt ("connect
production network now"), then poll TCP 443 to login.microsoft-
online.us for up to 10 min with a hard timeout so the loop always
exits. Uses Test-NetConnection -Port 443 (not Test-Connection /
ICMP) because Microsoft 365 edges do not reliably respond to ping.
- playbook/migrate-to-wifi.ps1: Gates the entire wired-disable
migration on "does a WiFi adapter exist?" If not (tower), the
script is a no-op. If yes, disable wired / wait for WiFi internet
with a 5 min timeout / re-enable wired on timeout fallback.
- startnet.cmd stages both new scripts to W:\Enrollment\ next to
run-enrollment.ps1 during the WinPE phase.
- FlatUnattendW10-shopfloor.xml Orders 4 and 5 shrunk to short
invocations of C:\Enrollment\wait-for-internet.ps1 and
C:\Enrollment\migrate-to-wifi.ps1.
- startnet-template.cmd kept in sync.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
354 lines
12 KiB
Batchfile
354 lines
12 KiB
Batchfile
@echo off
|
|
echo Please wait while 'WinPE' is being processed. This may take a few seconds.
|
|
wpeinit
|
|
powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
|
|
|
|
REM --- Wait for network (DHCP may take a moment after wpeinit) ---
|
|
echo Waiting for network...
|
|
:wait_net
|
|
ping -n 2 10.9.100.1 >NUL 2>&1
|
|
if errorlevel 1 goto wait_net
|
|
echo Network ready.
|
|
|
|
REM --- BIOS update check (runs before imaging menu) ---
|
|
set BIOS_STATUS=No BIOS check (share unavailable)
|
|
net use B: \\10.9.100.1\winpeapps\_shared /user:pxe-upload pxe /persistent:no 2>NUL
|
|
if exist B:\BIOS\check-bios.cmd (
|
|
echo.
|
|
echo Checking for BIOS updates...
|
|
call B:\BIOS\check-bios.cmd
|
|
REM If BIOS was flashed, check-bios.cmd reboots and we never reach here.
|
|
echo.
|
|
)
|
|
net use B: /delete 2>NUL
|
|
|
|
:menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo WinPE Setup Menu
|
|
echo ========================================
|
|
echo Firmware: %BIOS_STATUS%
|
|
echo.
|
|
echo Please select an option:
|
|
echo.
|
|
echo 1. GEA Standard
|
|
echo 2. GEA Engineer
|
|
echo 3. GEA Shopfloor
|
|
echo 4. GE Standard
|
|
echo 5. GE Engineer
|
|
echo 6. GE Shopfloor Lockdown
|
|
echo 7. GE Shopfloor MCE
|
|
echo.
|
|
echo ========================================
|
|
echo.
|
|
set /p choice=Enter your choice (1-7):
|
|
|
|
REM --- Only shopfloor images (3,6,7) need GCCH enrollment ---
|
|
set PPKG=
|
|
if "%choice%"=="3" goto enroll_menu
|
|
if "%choice%"=="6" goto enroll_menu
|
|
if "%choice%"=="7" goto enroll_menu
|
|
goto enroll_staged
|
|
|
|
:enroll_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo GCCH Enrollment Profile
|
|
echo ========================================
|
|
echo.
|
|
echo 1. No Office
|
|
echo 2. Standard Office (x86)
|
|
echo 3. Standard Office (x64)
|
|
echo 4. Pro Plus Office (x86) with Access
|
|
echo 5. Pro Plus Office (x64) with Access
|
|
echo 6. Skip enrollment
|
|
echo.
|
|
set /p enroll=Enter your choice (1-6):
|
|
if "%enroll%"=="1" set PPKG=GCCH_Prod_SFLD_NoOffice_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="2" set PPKG=GCCH_Prod_SFLD_StdOffice-x86_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="3" set PPKG=GCCH_Prod_SFLD_StdOffice-x64_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="4" set PPKG=GCCH_Prod_SFLD_ProPlusOffice-x86_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="5" set PPKG=GCCH_Prod_SFLD_ProPlusOffice-x64_US_Exp_20260430_v4.8.ppkg
|
|
if "%enroll%"=="6" set PPKG=
|
|
if "%enroll%"=="" goto enroll_menu
|
|
|
|
:pctype_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Shopfloor PC Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. CMM
|
|
echo 2. Wax and Trace
|
|
echo 3. Keyence
|
|
echo 4. Genspect
|
|
echo 5. Display
|
|
echo 6. Standard
|
|
echo 7. Lab
|
|
echo.
|
|
set PCTYPE=
|
|
set /p pctype_choice=Enter your choice (1-7):
|
|
if "%pctype_choice%"=="1" set PCTYPE=CMM
|
|
if "%pctype_choice%"=="2" set PCTYPE=WaxAndTrace
|
|
if "%pctype_choice%"=="3" set PCTYPE=Keyence
|
|
if "%pctype_choice%"=="4" set PCTYPE=Genspect
|
|
if "%pctype_choice%"=="5" set PCTYPE=Display
|
|
if "%pctype_choice%"=="6" set PCTYPE=Standard
|
|
if "%pctype_choice%"=="7" set PCTYPE=Lab
|
|
if "%PCTYPE%"=="" goto pctype_menu
|
|
|
|
REM --- Sub-type selection menus ---
|
|
REM PCSUBTYPE is written to pc-subtype.txt alongside pc-type.txt.
|
|
REM Scripts read it to look up the right profile in site-config.json.
|
|
set PCSUBTYPE=
|
|
set DISPLAYTYPE=
|
|
|
|
REM --- Standard sub-type ---
|
|
if not "%PCTYPE%"=="Standard" goto skip_standard_menu
|
|
:standard_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Standard PC Sub-Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. Timeclock (WJ Shopfloor only)
|
|
echo 2. Machine (WJ Shopfloor, Plant Apps, eDNC, UDC)
|
|
echo.
|
|
set /p standard_choice=Enter your choice (1-2):
|
|
if "%standard_choice%"=="1" set PCSUBTYPE=Timeclock
|
|
if "%standard_choice%"=="2" set PCSUBTYPE=Machine
|
|
if "%PCSUBTYPE%"=="" goto standard_menu
|
|
|
|
REM --- Machine number (Standard only) ---
|
|
set MACHINENUM=9999
|
|
echo.
|
|
set /p MACHINENUM=Enter machine number (digits, or Enter for 9999):
|
|
if "%MACHINENUM%"=="" set MACHINENUM=9999
|
|
echo Machine number: %MACHINENUM%
|
|
:skip_standard_menu
|
|
|
|
REM --- Display sub-type ---
|
|
if not "%PCTYPE%"=="Display" goto skip_display_menu
|
|
:display_menu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Display Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. Lobby Display
|
|
echo 2. Dashboard
|
|
echo.
|
|
set /p display_choice=Enter your choice (1-2):
|
|
if "%display_choice%"=="1" set DISPLAYTYPE=Lobby
|
|
if "%display_choice%"=="1" set PCSUBTYPE=Lobby
|
|
if "%display_choice%"=="2" set DISPLAYTYPE=Dashboard
|
|
if "%display_choice%"=="2" set PCSUBTYPE=Dashboard
|
|
if "%PCSUBTYPE%"=="" goto display_menu
|
|
:skip_display_menu
|
|
|
|
REM --- Map enrollment share early (kept open for copy after imaging) ---
|
|
set NEED_ENROLL=0
|
|
if not "%PPKG%"=="" set NEED_ENROLL=1
|
|
if not "%PCTYPE%"=="" set NEED_ENROLL=1
|
|
if "%NEED_ENROLL%"=="0" goto enroll_staged
|
|
net use Y: \\10.9.100.1\enrollment /user:pxe-upload pxe /persistent:no
|
|
if "%PPKG%"=="" goto enroll_staged
|
|
if not exist "Y:\%PPKG%" (
|
|
echo WARNING: %PPKG% not found on server. Enrollment will be skipped.
|
|
set PPKG=
|
|
)
|
|
:enroll_staged
|
|
|
|
echo. > X:\Boot.tag
|
|
if "%choice%"=="1" goto gea-standard
|
|
if "%choice%"=="2" goto gea-engineer
|
|
if "%choice%"=="3" goto gea-shopfloor
|
|
if "%choice%"=="4" goto ge-standard
|
|
if "%choice%"=="5" goto ge-engineer
|
|
if "%choice%"=="6" goto ge-shopfloor-lockdown
|
|
if "%choice%"=="7" goto ge-shopfloor-mce
|
|
echo Invalid choice. Please try again.
|
|
pause
|
|
goto menu
|
|
|
|
:gea-standard
|
|
echo.
|
|
echo Starting GEA Standard setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-standard /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:gea-engineer
|
|
echo.
|
|
echo Starting GEA Engineer setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-engineer /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:gea-shopfloor
|
|
echo.
|
|
echo Starting GEA Shopfloor setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\gea-shopfloor /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-standard
|
|
echo.
|
|
echo Starting GE Standard setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-standard /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-engineer
|
|
echo.
|
|
echo Starting GE Engineer setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-engineer /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-shopfloor-lockdown
|
|
echo.
|
|
echo Starting GE Shopfloor Lockdown setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-shopfloor-lockdown /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:ge-shopfloor-mce
|
|
echo.
|
|
echo Starting GE Shopfloor MCE setup...
|
|
start "FlatApp" %SYSTEMDRIVE%\GESetup\FlatSetupLoader.exe
|
|
for /l %%i in (1,1,2000000) do rem
|
|
net use Z: \\10.9.100.1\winpeapps\ge-shopfloor-mce /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:end
|
|
echo.
|
|
echo Waiting for PESetup.exe to start...
|
|
:wait_start
|
|
ping -n 3 127.0.0.1 >NUL
|
|
wmic process where "name='PESetup.exe'" get name 2>NUL | find /I "PESetup" >NUL
|
|
if errorlevel 1 goto wait_start
|
|
echo PESetup.exe is running. Waiting for imaging to complete...
|
|
|
|
REM --- Copy enrollment package and shopfloor setup as soon as Windows partition appears ---
|
|
if "%PPKG%"=="" if "%PCTYPE%"=="" goto wait_finish
|
|
echo Waiting for Windows partition at W: ...
|
|
:wait_enroll
|
|
ping -n 11 127.0.0.1 >NUL
|
|
if not exist W:\Windows\System32\config\system goto wait_enroll
|
|
echo Found Windows at W:
|
|
mkdir W:\Enrollment 2>NUL
|
|
|
|
REM --- Copy site config (drives site-specific values in all setup scripts) ---
|
|
if exist "Y:\site-config.json" (
|
|
copy /Y "Y:\site-config.json" "W:\Enrollment\site-config.json"
|
|
echo Copied site-config.json.
|
|
) else (
|
|
echo WARNING: site-config.json not found on enrollment share.
|
|
)
|
|
|
|
REM --- Copy PPKG if selected ---
|
|
if "%PPKG%"=="" goto copy_pctype
|
|
copy /Y "Y:\%PPKG%" "W:\Enrollment\%PPKG%"
|
|
if errorlevel 1 (
|
|
echo WARNING: Failed to copy enrollment package.
|
|
goto copy_pctype
|
|
)
|
|
copy /Y "Y:\run-enrollment.ps1" "W:\Enrollment\run-enrollment.ps1"
|
|
copy /Y "Y:\wait-for-internet.ps1" "W:\Enrollment\wait-for-internet.ps1"
|
|
copy /Y "Y:\migrate-to-wifi.ps1" "W:\Enrollment\migrate-to-wifi.ps1"
|
|
|
|
REM --- Create enroll.cmd at drive root as manual fallback ---
|
|
> W:\enroll.cmd (
|
|
echo @echo off
|
|
echo echo Waiting for network...
|
|
echo :waitnet
|
|
echo ping -n 2 8.8.8.8 ^>NUL 2^>^&1
|
|
echo if errorlevel 1 goto waitnet
|
|
echo echo Network connected. Running enrollment...
|
|
echo powershell.exe -ExecutionPolicy Bypass -File "C:\run-enrollment.ps1"
|
|
)
|
|
echo Manual fallback created at W:\enroll.cmd
|
|
|
|
:copy_pctype
|
|
REM --- Copy shopfloor PC type setup scripts ---
|
|
if "%PCTYPE%"=="" goto cleanup_enroll
|
|
echo %PCTYPE%> W:\Enrollment\pc-type.txt
|
|
if not "%DISPLAYTYPE%"=="" echo %DISPLAYTYPE%> W:\Enrollment\display-type.txt
|
|
if not "%PCSUBTYPE%"=="" echo %PCSUBTYPE%> W:\Enrollment\pc-subtype.txt
|
|
if not "%MACHINENUM%"=="" echo %MACHINENUM%> W:\Enrollment\machine-number.txt
|
|
copy /Y "Y:\shopfloor-setup\Run-ShopfloorSetup.ps1" "W:\Enrollment\Run-ShopfloorSetup.ps1"
|
|
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"
|
|
if exist "Y:\shopfloor-setup\Shopfloor" (
|
|
mkdir W:\Enrollment\shopfloor-setup\Shopfloor 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\Shopfloor" "W:\Enrollment\shopfloor-setup\Shopfloor\"
|
|
echo Copied Shopfloor baseline setup files.
|
|
)
|
|
REM --- Copy type-specific scripts on top of baseline ---
|
|
if exist "Y:\shopfloor-setup\%PCTYPE%" (
|
|
mkdir "W:\Enrollment\shopfloor-setup\%PCTYPE%" 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\%PCTYPE%" "W:\Enrollment\shopfloor-setup\%PCTYPE%\"
|
|
echo Copied %PCTYPE% setup files.
|
|
) else (
|
|
echo WARNING: No setup files found for PC type %PCTYPE%.
|
|
)
|
|
|
|
REM --- Stage preinstall bundle (apps installed locally to save Azure bandwidth) ---
|
|
if exist "Y:\preinstall\preinstall.json" (
|
|
mkdir W:\PreInstall 2>NUL
|
|
mkdir W:\PreInstall\installers 2>NUL
|
|
copy /Y "Y:\preinstall\preinstall.json" "W:\PreInstall\preinstall.json"
|
|
if exist "Y:\preinstall\installers" (
|
|
xcopy /E /Y /I "Y:\preinstall\installers" "W:\PreInstall\installers\"
|
|
echo Staged preinstall bundle to W:\PreInstall.
|
|
) else (
|
|
echo WARNING: Y:\preinstall\installers not found - preinstall.json staged without installers.
|
|
)
|
|
) else (
|
|
echo No preinstall bundle on PXE server - skipping.
|
|
)
|
|
|
|
REM --- Stage CMM bootstrap bundle (CMM-type PCs only) ---
|
|
REM Copies the Hexagon installer bundle (~1.9 GB) from the PXE server enrollment
|
|
REM share onto the target disk so 01-Setup-CMM.ps1 can install from local disk.
|
|
REM The tsgwp00525 SFLD share that holds the canonical copy is not yet reachable
|
|
REM during shopfloor-setup (Azure DSC provisions those creds later), so this
|
|
REM bootstrap exists to get the first-install through. Post-imaging, the logon-
|
|
REM triggered CMM-Enforce.ps1 takes over from the share.
|
|
if /i not "%PCTYPE%"=="CMM" goto skip_cmm_stage
|
|
if exist "Y:\cmm-installers\cmm-manifest.json" (
|
|
mkdir W:\CMM-Install 2>NUL
|
|
xcopy /E /Y /I "Y:\cmm-installers" "W:\CMM-Install\"
|
|
echo Staged CMM bootstrap to W:\CMM-Install.
|
|
) else (
|
|
echo WARNING: Y:\cmm-installers not found - CMM PC cannot install Hexagon apps at imaging time.
|
|
)
|
|
:skip_cmm_stage
|
|
:pctype_done
|
|
|
|
:cleanup_enroll
|
|
net use Y: /delete 2>NUL
|
|
|
|
:wait_finish
|
|
ping -n 11 127.0.0.1 >NUL
|
|
wmic process where "name='PESetup.exe'" get name 2>NUL | find /I "PESetup" >NUL
|
|
if not errorlevel 1 goto wait_finish
|
|
echo.
|
|
echo Imaging complete. Rebooting in 15 seconds...
|
|
echo Press Ctrl+C to cancel.
|
|
ping -n 16 127.0.0.1 >NUL
|
|
wpeutil reboot
|