winpe-status-push.ps1 now accepts -CurrentStage / -StageIndex params so callers can override the default "WinPE: PESetup / WIM apply" string. Backwards compatible. startnet.cmd: after the existing initial WinPE status push, inspect $BIOS_STATUS for the "->" marker that check-bios.cmd writes when an update was actually applied or staged. If present, fire a second idx=1 push with stage="WinPE: BIOS firmware update - <status>". No-op for clean "up to date" / "no update in catalog" runs. imaging.html: at stage_idx=1 with "bios" in current_stage, swap friendly label to "Updating BIOS firmware" with a do-NOT-power-off hint. Bays without firmware updates show the default "Booting from PXE" label as before. boot.wim startnet.cmd updated via wimupdate so live PXE clients pick it up at next boot. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
408 lines
16 KiB
Batchfile
408 lines
16 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 172.16.9.1 >NUL 2>&1
|
|
if errorlevel 1 goto wait_net
|
|
echo Network ready.
|
|
|
|
REM --- BIOS update check (runs before imaging menu) ---
|
|
REM Mounts [winpeapps_bios] share. CRITICAL: do NOT call check-bios.cmd
|
|
REM inside an `if exist (...)` parens block - CMD's variable scoping for
|
|
REM CALLed scripts inside parens does not propagate BIOS_STATUS back to
|
|
REM this script reliably. Use goto-flow instead so the CALL runs at the
|
|
REM top scope and BIOS_STATUS persists.
|
|
set BIOS_STATUS=No BIOS check (share unavailable)
|
|
net use B: \\172.16.9.1\winpeapps_bios /user:pxe-upload pxe /persistent:no 2>NUL
|
|
if not exist B:\check-bios.cmd goto :bios_check_done
|
|
echo.
|
|
echo Checking for BIOS updates...
|
|
call B:\check-bios.cmd
|
|
:bios_check_done
|
|
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 (sub-menu)
|
|
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 --- Shopfloor images (3,6,7) need GCCH enrollment + (for 3) PC-type sub-menu.
|
|
REM Choice 3 = GEA Shopfloor: drill into sub-menu first to pick the gea-shopfloor-*
|
|
REM sub-category, THEN the office menu, THEN machine number for collections+nocollections.
|
|
set PPKG=
|
|
if "%choice%"=="3" goto gea_shopfloor_submenu
|
|
if "%choice%"=="6" goto enroll_menu
|
|
if "%choice%"=="7" goto enroll_menu
|
|
goto enroll_staged
|
|
|
|
:gea_shopfloor_submenu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo GEA Shopfloor PC Sub-Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. Machine with Collections (eDNC + UDC + Plant Apps)
|
|
echo 2. Machine without Collections (eDNC + Plant Apps, no UDC)
|
|
echo 3. Common (Timeclock, Lab; WJ Shopfloor only)
|
|
echo 4. Keyence (VR-6000 microscope/profilometer)
|
|
echo 5. CMM (Hexagon PC-DMIS + Protect Viewer)
|
|
echo 6. Genspect
|
|
echo 7. Heattreat (placeholder)
|
|
echo 8. Wax and Trace
|
|
echo 9. Display (kiosk dashboard)
|
|
echo.
|
|
set PCTYPE=
|
|
set /p ges_choice=Enter your choice (1-9):
|
|
if "%ges_choice%"=="1" set PCTYPE=gea-shopfloor-collections
|
|
if "%ges_choice%"=="2" set PCTYPE=gea-shopfloor-nocollections
|
|
if "%ges_choice%"=="3" set PCTYPE=gea-shopfloor-common
|
|
if "%ges_choice%"=="4" set PCTYPE=gea-shopfloor-keyence
|
|
if "%ges_choice%"=="5" set PCTYPE=gea-shopfloor-cmm
|
|
if "%ges_choice%"=="6" set PCTYPE=gea-shopfloor-genspect
|
|
if "%ges_choice%"=="7" set PCTYPE=gea-shopfloor-heattreat
|
|
if "%ges_choice%"=="8" set PCTYPE=gea-shopfloor-waxtrace
|
|
if "%ges_choice%"=="9" set PCTYPE=gea-shopfloor-display
|
|
if "%PCTYPE%"=="" goto gea_shopfloor_submenu
|
|
if "%PCTYPE%"=="gea-shopfloor-display" goto display_submenu
|
|
goto enroll_menu
|
|
|
|
:display_submenu
|
|
cls
|
|
echo.
|
|
echo ========================================
|
|
echo Display Kiosk Sub-Type
|
|
echo ========================================
|
|
echo.
|
|
echo 1. Dashboard (shop floor metrics dashboard)
|
|
echo 2. Lobby Display (lobby information screen)
|
|
echo.
|
|
set DISPLAYTYPE=
|
|
set /p disp_choice=Enter your choice (1-2):
|
|
if "%disp_choice%"=="1" set DISPLAYTYPE=Dashboard
|
|
if "%disp_choice%"=="2" set DISPLAYTYPE=Lobby
|
|
if "%DISPLAYTYPE%"=="" goto display_submenu
|
|
goto enroll_menu
|
|
|
|
: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):
|
|
|
|
REM --- PPKG configuration (constructed at menu time, see docs) ---
|
|
REM Vendor ships one source PPKG; we construct the BPRT-tagged filename
|
|
REM by filling in Office, Region, Expiry, Version on the target copy.
|
|
REM Update SOURCE_PPKG + PPKG_VER when a new PPKG is released.
|
|
set SOURCE_PPKG=GCCH_Prod_SFLD_v4.14.ppkg
|
|
set PPKG_VER=v4.14
|
|
set PPKG_EXP=20260831
|
|
set REGION=US
|
|
|
|
set OFFICE=
|
|
if "%enroll%"=="1" set OFFICE=NoOffice
|
|
if "%enroll%"=="2" set OFFICE=StdOffice-x86
|
|
if "%enroll%"=="3" set OFFICE=StdOffice-x64
|
|
if "%enroll%"=="4" set OFFICE=ProPlusOffice-x86
|
|
if "%enroll%"=="5" set OFFICE=ProPlusOffice-x64
|
|
if "%enroll%"=="6" set OFFICE=
|
|
if "%enroll%"=="" goto enroll_menu
|
|
|
|
set PPKG=
|
|
if not "%OFFICE%"=="" set PPKG=GCCH_Prod_SFLD_%OFFICE%_%REGION%_Exp_%PPKG_EXP%_%PPKG_VER%.ppkg
|
|
|
|
REM --- 2026-05-04 rename reorg: PCTYPE is set by gea_shopfloor_submenu above
|
|
REM (single string, e.g. gea-shopfloor-collections). pc-subtype.txt is no
|
|
REM longer written. DISPLAYTYPE IS still written (display-type.txt) when
|
|
REM PCTYPE=gea-shopfloor-display because Install-KioskApp.cmd needs Lobby
|
|
REM vs Dashboard to choose installer + Get-PCProfile builds Display-{type}
|
|
REM profile key.
|
|
set PCSUBTYPE=
|
|
|
|
REM --- Machine number (collections + nocollections only; other variants don't use one) ---
|
|
set MACHINENUM=9999
|
|
if /i "%PCTYPE%"=="gea-shopfloor-collections" goto prompt_machinenum
|
|
if /i "%PCTYPE%"=="gea-shopfloor-nocollections" goto prompt_machinenum
|
|
goto skip_machinenum
|
|
:prompt_machinenum
|
|
echo.
|
|
set /p MACHINENUM=Enter machine number (digits, or Enter for 9999):
|
|
if "%MACHINENUM%"=="" set MACHINENUM=9999
|
|
echo Machine number: %MACHINENUM%
|
|
:skip_machinenum
|
|
|
|
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: \\172.16.9.1\enrollment /user:pxe-upload pxe /persistent:no
|
|
if "%PPKG%"=="" goto enroll_staged
|
|
if not exist "Y:\ppkgs\%SOURCE_PPKG%" (
|
|
echo WARNING: %SOURCE_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: \\172.16.9.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: \\172.16.9.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: \\172.16.9.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: \\172.16.9.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: \\172.16.9.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: \\172.16.9.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: \\172.16.9.1\winpeapps\ge-shopfloor-mce /user:pxe-upload pxe /persistent:no
|
|
goto end
|
|
|
|
:end
|
|
echo.
|
|
|
|
REM --- Push initial "WinPE staging" status to PXE webapp ---
|
|
REM Externalized to Y:\scripts\winpe-status-push.ps1 so future edits don't
|
|
REM require a boot.wim rebuild. Best-effort; the script logs to
|
|
REM X:\Windows\Temp\winpe-status-push.log and swallows all errors.
|
|
if exist "Y:\scripts\winpe-status-push.ps1" (
|
|
powershell -NoProfile -ExecutionPolicy Bypass -File "Y:\scripts\winpe-status-push.ps1"
|
|
)
|
|
|
|
REM --- BIOS update sub-stage push ---
|
|
REM If check-bios.cmd actually applied or staged a firmware update, push
|
|
REM a second idx=1 status with a BIOS-specific stage string so the
|
|
REM dashboard friendly-label swaps to "Updating BIOS firmware". The "->"
|
|
REM marker is what check-bios writes for both "updated" and "STAGED"
|
|
REM cases. No-op states ("up to date", "no update in catalog", "Skipped",
|
|
REM "missing") never contain the arrow and stay on the default label.
|
|
echo %BIOS_STATUS% | findstr /C:"->" >NUL
|
|
if not errorlevel 1 (
|
|
if exist "Y:\scripts\winpe-status-push.ps1" (
|
|
powershell -NoProfile -ExecutionPolicy Bypass -File "Y:\scripts\winpe-status-push.ps1" -CurrentStage "WinPE: BIOS firmware update - %BIOS_STATUS%"
|
|
)
|
|
)
|
|
|
|
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:\config\site-config.json" (
|
|
copy /Y "Y:\config\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 (renames from SOURCE to BPRT-tagged filename) ---
|
|
if "%PPKG%"=="" goto copy_pctype
|
|
copy /Y "Y:\ppkgs\%SOURCE_PPKG%" "W:\Enrollment\%PPKG%"
|
|
if errorlevel 1 (
|
|
echo WARNING: Failed to copy enrollment package.
|
|
goto copy_pctype
|
|
)
|
|
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"
|
|
|
|
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
|
|
REM 2026-05-04 rename reorg: pc-subtype.txt no longer written.
|
|
REM display-type.txt IS still written for gea-shopfloor-display because
|
|
REM Install-KioskApp.cmd reads it to pick Lobby vs Dashboard installer
|
|
REM and Get-PCProfile.ps1 reads it to build the Display-{type} profile key.
|
|
if not "%DISPLAYTYPE%"=="" echo %DISPLAYTYPE%> W:\Enrollment\display-type.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 --- Always copy common/ (cross-PC-type GE-Enforce dispatcher + lib live here post-v2) ---
|
|
if exist "Y:\shopfloor-setup\common" (
|
|
mkdir W:\Enrollment\shopfloor-setup\common 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\common" "W:\Enrollment\shopfloor-setup\common\"
|
|
echo Copied common setup files.
|
|
)
|
|
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'.
|
|
if exist "Y:\shopfloor-setup\_ntlars-backups" (
|
|
mkdir W:\Enrollment\shopfloor-setup\_ntlars-backups 2>NUL
|
|
xcopy /E /Y /I "Y:\shopfloor-setup\_ntlars-backups" "W:\Enrollment\shopfloor-setup\_ntlars-backups\"
|
|
echo Copied _ntlars-backups.
|
|
)
|
|
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:\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"
|
|
if exist "Y:\pre-install\installers" (
|
|
xcopy /E /Y /I "Y:\pre-install\installers" "W:\PreInstall\installers\"
|
|
echo Staged preinstall bundle to W:\PreInstall.
|
|
) else (
|
|
echo WARNING: Y:\pre-install\installers not found - preinstall.json staged without installers.
|
|
)
|
|
if exist "Y:\pre-install\udc-backups" (
|
|
xcopy /E /Y /I "Y:\pre-install\udc-backups" "W:\PreInstall\udc-backups\"
|
|
echo Staged UDC settings backups to W:\PreInstall\udc-backups.
|
|
)
|
|
) 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 09-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
|
|
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 exist "Y:\installers-post\cmm\cmm-manifest.json" (
|
|
mkdir W:\CMM-Install 2>NUL
|
|
xcopy /E /Y /I "Y:\installers-post\cmm" "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
|