Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ private/ # Orchestration helpers – not exported
main/ # Core module init (Initialize-OSDCloudModule)
microsoft-update-catalog/ # MUC lookup
operatingsystem/ # OS catalog helpers
WinPEStartup/ # WinPE boot sequence
WinpeStartup/ # WinPE boot sequence
steps/ # Workflow step implementations
workflow/ # Workflow orchestration helpers
classes/ # PowerShell class definitions (dot-sourced before functions)
Expand Down
56 changes: 28 additions & 28 deletions .github/skills/author-winpe-profile-json/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,37 @@ description: Author and update OSDCloud WinPE startup profile JSON files. Use th

# Author WinPE Profile JSON

Create profiles that configure `Invoke-WinPEStartup` without embedding workflow logic in the profile. Preserve the existing JSON style and make the smallest change that satisfies the request.
Create profiles that configure `Invoke-WinpeStartup` without embedding workflow logic in the profile. Preserve the existing JSON style and make the smallest change that satisfies the request.

## Profile location and discovery

- Store bundled profiles in `OSDCloud/core/winpestartup-profiles/`.
- Use a descriptive `.json` filename. The startup function discovers profile files from `WinPEStartup\Profiles` on attached drives.
- Use a descriptive `.json` filename. The startup function discovers profile files from `WinpeStartup\Profiles` on attached drives.
- A profile is a flat map of parameter names to scalar values or arrays, with one supported nested object: the top-level `Environment` section.
- Prefer standard JSON. The loader tolerates comments, but comments are unnecessary and can make external validation fail.

## Property names

Use the exact `Invoke-WinPEStartup:` prefix for every profile property:
Use the exact `Invoke-WinpeStartup:` prefix for every profile property:

| Property | JSON value | Effect |
|---|---|---|
| `Invoke-WinPEStartup:SkipOnScreenKeyboard` | boolean | Skip the on-screen keyboard check |
| `Invoke-WinPEStartup:ShowPnpDevices` | boolean | Show PnP device hardware |
| `Invoke-WinPEStartup:ShowPnpErrors` | boolean | Show PnP device errors |
| `Invoke-WinPEStartup:SkipWiFi` | boolean | Skip Wi-Fi startup and connection checks |
| `Invoke-WinPEStartup:SkipIPConfig` | boolean | Skip IP configuration display |
| `Invoke-WinPEStartup:SkipUpdateOSDCloud` | boolean | Skip the OSDCloud module update |
| `Invoke-WinPEStartup:InstallModule` | string or string array | Update additional PowerShell modules |
| `Invoke-WinPEStartup:InvokeStartupCommand` | string or string array | Run commands before the main phase |
| `Invoke-WinPEStartup:InvokeStartupCommandNoExit` | boolean | Keep the startup child PowerShell open |
| `Invoke-WinPEStartup:InvokeStartupCommandEA` | `Continue` or `Stop` | Handle startup child-process failure |
| `Invoke-WinPEStartup:InvokeMainCommand` | string or string array | Run commands in the main phase |
| `Invoke-WinPEStartup:InvokeMainCommandNoExit` | boolean | Keep the main child PowerShell open |
| `Invoke-WinPEStartup:InvokeMainCommandEA` | `Continue` or `Stop` | Handle main child-process failure |
| `Invoke-WinPEStartup:InvokeShutdownCommand` | string or string array | Run commands in the shutdown phase |
| `Invoke-WinPEStartup:InvokeShutdownCommandNoExit` | boolean | Keep the shutdown child PowerShell open |
| `Invoke-WinPEStartup:InvokeShutdownCommandEA` | `Continue` or `Stop` | Handle shutdown child-process failure |
| `Invoke-WinpeStartup:SkipOnScreenKeyboard` | boolean | Skip the on-screen keyboard check |
| `Invoke-WinpeStartup:ShowPnpDevices` | boolean | Show PnP device hardware |
| `Invoke-WinpeStartup:ShowPnpErrors` | boolean | Show PnP device errors |
| `Invoke-WinpeStartup:SkipWiFi` | boolean | Skip Wi-Fi startup and connection checks |
| `Invoke-WinpeStartup:SkipIPConfig` | boolean | Skip IP configuration display |
| `Invoke-WinpeStartup:SkipUpdateOSDCloud` | boolean | Skip the OSDCloud module update |
| `Invoke-WinpeStartup:InstallModule` | string or string array | Update additional PowerShell modules |
| `Invoke-WinpeStartup:InvokeStartupCommand` | string or string array | Run commands before the main phase |
| `Invoke-WinpeStartup:InvokeStartupCommandNoExit` | boolean | Keep the startup child PowerShell open |
| `Invoke-WinpeStartup:InvokeStartupCommandEA` | `Continue` or `Stop` | Handle startup child-process failure |
| `Invoke-WinpeStartup:InvokeMainCommand` | string or string array | Run commands in the main phase |
| `Invoke-WinpeStartup:InvokeMainCommandNoExit` | boolean | Keep the main child PowerShell open |
| `Invoke-WinpeStartup:InvokeMainCommandEA` | `Continue` or `Stop` | Handle main child-process failure |
| `Invoke-WinpeStartup:InvokeShutdownCommand` | string or string array | Run commands in the shutdown phase |
| `Invoke-WinpeStartup:InvokeShutdownCommandNoExit` | boolean | Keep the shutdown child PowerShell open |
| `Invoke-WinpeStartup:InvokeShutdownCommandEA` | `Continue` or `Stop` | Handle shutdown child-process failure |

Use JSON booleans (`true`/`false`) rather than quoted boolean strings. Use arrays when there are multiple commands or modules; command entries execute in array order in one child PowerShell process.

Expand Down Expand Up @@ -64,7 +64,7 @@ Use an unprefixed top-level `Environment` object to set process-scoped environme

- Write ordinary PowerShell lines as strings, for example `Show-OSDCloudDeviceInfo` or `Deploy-OSDCloud`.
- Use `Restart-Computer -Force` for a restart at the end of the shutdown phase. Do not use `shutdown.exe` unless the request specifically requires its options.
- URLs beginning with `http://` or `https://` are automatically converted to `Invoke-RestMethod -Uri '<url>' | Invoke-Expression` by `Invoke-WinPEStartup`. Do not wrap those URLs yourself.
- URLs beginning with `http://` or `https://` are automatically converted to `Invoke-RestMethod -Uri '<url>' | Invoke-Expression` by `Invoke-WinpeStartup`. Do not wrap those URLs yourself.
- A `NoExit` setting leaves the child process open. Do not set it for a normal deployment or restart profile unless the user explicitly requests an interactive window.
- `Continue` is the default failure behavior. Choose `Stop` only when a failed child command must terminate startup.
- Keep deployment commands in the appropriate phase. For example, inspection and deployment belong in `InvokeMainCommand`; reboot belongs in `InvokeShutdownCommand`.
Expand All @@ -75,13 +75,13 @@ Use an unprefixed top-level `Environment` object to set process-scoped environme

```json
{
"Invoke-WinPEStartup:InvokeMainCommand": [
"Invoke-WinpeStartup:InvokeMainCommand": [
"Show-OSDCloudDeviceInfo",
"Deploy-OSDCloud"
],
"Invoke-WinPEStartup:InvokeMainCommandNoExit": true,
"Invoke-WinPEStartup:InvokeMainCommandEA": "Continue",
"Invoke-WinPEStartup:InvokeShutdownCommand": [
"Invoke-WinpeStartup:InvokeMainCommandNoExit": true,
"Invoke-WinpeStartup:InvokeMainCommandEA": "Continue",
"Invoke-WinpeStartup:InvokeShutdownCommand": [
"Restart-Computer -Force"
]
}
Expand All @@ -91,11 +91,11 @@ Use an unprefixed top-level `Environment` object to set process-scoped environme

```json
{
"Invoke-WinPEStartup:InvokeMainCommand": [
"Invoke-WinpeStartup:InvokeMainCommand": [
"Show-OSDCloudDeviceInfo"
],
"Invoke-WinPEStartup:InvokeMainCommandNoExit": true,
"Invoke-WinPEStartup:InvokeMainCommandEA": "Continue"
"Invoke-WinpeStartup:InvokeMainCommandNoExit": true,
"Invoke-WinpeStartup:InvokeMainCommandEA": "Continue"
}
```

Expand All @@ -115,7 +115,7 @@ $profile | Out-Null
6. For command changes, verify the resulting property explicitly:

```powershell
$profile.'Invoke-WinPEStartup:InvokeShutdownCommand'
$profile.'Invoke-WinpeStartup:InvokeShutdownCommand'
```

Do not execute profile commands during validation. Parsing verifies syntax without starting deployment, downloading content, or restarting the workstation.
30 changes: 20 additions & 10 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

All notable changes to this project will be documented in this file.

## 26.10.4.1 - October 4, 2026

### Changed

- Standardized `WinPEStartup` naming to `WinpeStartup` across exported startup cmdlets, private helpers, source folders and files, internal calls, status messages, and function help.
- Updated module defaults and the bundled OSDCloud startup profile to use the `Invoke-WinpeStartup:` JSON key prefix. Startup driver, file, and profile discovery now consistently references `WinpeStartup\Drivers`, `WinpeStartup\Files`, and `WinpeStartup\profiles`.
- Updated the module description, README command reference, deployment and troubleshooting guides, startup documentation, feature and privacy documentation, and profile-authoring guidance to use the same naming.
- Retained existing PEStartup compatibility aliases and updated their targets to the standardized cmdlet names. This release changes capitalization only; startup parameters, defaults, and deployment behavior are unchanged.
- Module version bumped from `26.10.2.1` to `26.10.4.1`.

## 26.10.2.1 - October 2, 2026

### Added
Expand Down Expand Up @@ -108,7 +118,7 @@ All notable changes to this project will be documented in this file.

### Removed

- Removed the deprecated `Initialize-WinPEStartupScript` helper and obsolete startup, main, and shutdown script initialization references.
- Removed the deprecated `Initialize-WinpeStartupScript` helper and obsolete startup, main, and shutdown script initialization references.

## 26.9.8.1 - September 8, 2026

Expand All @@ -118,7 +128,7 @@ All notable changes to this project will be documented in this file.
- Added OSDeploy license registration, license state management, and license help output.
- Added verbose workflow step diagnostics for deployment troubleshooting.
- Added WinPE startup profiles for restart and shutdown actions.
- Added a WinPEStartup guide and updated deployment, troubleshooting, and unattended USB documentation.
- Added a WinpeStartup guide and updated deployment, troubleshooting, and unattended USB documentation.

### Changed

Expand All @@ -128,7 +138,7 @@ All notable changes to this project will be documented in this file.
- Preserved operating system language selections through deployment parameter resolution.
- Improved device identity handling and hashed the device identifier used for telemetry.
- Renamed device identity and license properties to use the current core naming conventions.
- Refreshed WinPEStartup initialization, command execution, module update, Wi-Fi, USB, and device error handling paths.
- Refreshed WinpeStartup initialization, command execution, module update, Wi-Fi, USB, and device error handling paths.
- Updated workflow step logging, status output, target disk checks, driver pack checks, and Windows image validation.
- Refactored driver pack catalog retrieval and update functions across Dell, HP, Lenovo, Panasonic, and Surface catalogs.
- Updated Windows 11 25H2 operating system catalog content to build `26200.9168`.
Expand Down Expand Up @@ -173,7 +183,7 @@ All notable changes to this project will be documented in this file.
- Improved cache, operating system URL, device identity, and catalog initialization status logging for clearer troubleshooting.
- Improved workflow operating system resolution and parameter flow by centralizing OS settings selection and activation resolution logic.
- Updated workflow and task execution scripts with standardized informational logging markers and aligned step/test behavior for target disk, driver pack, and Windows image validation.
- Updated WinPEStartup components, including Wi-Fi and USB drive-letter initialization paths, to align with the revised deployment/core orchestration flow.
- Updated WinpeStartup components, including Wi-Fi and USB drive-letter initialization paths, to align with the revised deployment/core orchestration flow.
- Updated Microsoft Update Catalog save helpers and related driver workflow step behavior to match revised validation and logging patterns.
- Updated workflow UI `MainWindow` scripts across classic, default, dev, insiders, and vNext channels for consistency with the updated deployment flow.
- Updated repository guidance in Copilot instruction assets and catalog update instructions.
Expand Down Expand Up @@ -248,7 +258,7 @@ All notable changes to this project will be documented in this file.

### Added

- Added WinPEStartup profiles for `Deploy-OSDCloud` and `Show-OSDCloudDeviceInfo`.
- Added WinpeStartup profiles for `Deploy-OSDCloud` and `Show-OSDCloudDeviceInfo`.

### Changed

Expand Down Expand Up @@ -434,15 +444,15 @@ All notable changes to this project will be documented in this file.
### Added

- Reference documentation for all 12 exported functions in `OSDCloud/docs/`:
- New pages: `Invoke-WinPEStartup.md`, `Invoke-WinPEStartupManager.md`,
`Show-WinPEStartupDevices.md`, `Show-WinPEStartupDeviceErrors.md`,
`Show-WinPEStartupIpconfig.md`, `Show-WinPEStartupWifi.md`,
`Update-WinPEStartupModule.md`
- New pages: `Invoke-WinpeStartup.md`, `Invoke-WinpeStartupManager.md`,
`Show-WinpeStartupDevices.md`, `Show-WinpeStartupDeviceErrors.md`,
`Show-WinpeStartupIpconfig.md`, `Show-WinpeStartupWifi.md`,
`Update-WinpeStartupModule.md`
- Updated existing pages to fill in blank `ProgressAction` descriptions,
add `INPUTS`/`OUTPUTS`/`NOTES` sections, and cross-link related pages.
- Conceptual guides in `docs/`:
- `getting-started.md` — installation, quick start, and cmdlet overview.
- `winpe-startup.md` — WinPEStartup sequence, script hooks, USB profiles,
- `winpe-startup.md` — WinpeStartup sequence, script hooks, USB profiles,
and `InvokeXxxCommand` behaviour.
- `psoptions.md` — two-layer `PSDefaultParameterValues` system with full
key reference table and override examples.
Expand Down
4 changes: 2 additions & 2 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

---

## WinPEStartup Orchestration
## WinpeStartup Orchestration

`Invoke-WinPEStartup` automates everything between power-on and deployment — loading drivers, connecting to the network, and auto-updating OSDCloud — in a single command. Drop a JSON profile on a USB drive for site-specific settings without touching the boot image. Extend the sequence with custom PowerShell or a HTTPS URL at any phase.
`Invoke-WinpeStartup` automates everything between power-on and deployment — loading drivers, connecting to the network, and auto-updating OSDCloud — in a single command. Drop a JSON profile on a USB drive for site-specific settings without touching the boot image. Extend the sequence with custom PowerShell or a HTTPS URL at any phase.

---

Expand Down
18 changes: 9 additions & 9 deletions OSDCloud/OSDCloud.psd1
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
@{
# --- Identity ---
RootModule = 'OSDCloud.psm1'
ModuleVersion = '26.10.2.1'
ModuleVersion = '26.10.4.1'
CompatiblePSEditions = @('Core', 'Desktop')
GUID = '2fbd5c65-79c7-4561-9a2e-c4a4eebc89c7'

Expand All @@ -17,7 +17,7 @@
Copyright = '(c) 2026 Recast Software. All rights reserved.'
Description = @'
Recast OSDCloud PowerShell Module.
PowerShell module for OSDCloud v2 deployment automation and WinPEStartup from recastsoftware.com.
PowerShell module for OSDCloud v2 deployment automation and WinpeStartup from recastsoftware.com.
Includes operating system, driver pack, and device provisioning workflows.
Windows 11 26H2 GA Release
'@
Expand All @@ -34,13 +34,13 @@ Windows 11 26H2 GA Release
'Show-OSDCloudDeviceInfo',
'Start-OSDCloudExplorer',
# WinPE
'Invoke-WinPEStartup',
'Invoke-WinPEStartupManager',
'Show-WinPEStartupDeviceErrors',
'Show-WinPEStartupDevices',
'Show-WinPEStartupIpconfig',
'Show-WinPEStartupWifi',
'Update-WinPEStartupModule'
'Invoke-WinpeStartup',
'Invoke-WinpeStartupManager',
'Show-WinpeStartupDeviceErrors',
'Show-WinpeStartupDevices',
'Show-WinpeStartupIpconfig',
'Show-WinpeStartupWifi',
'Update-WinpeStartupModule'
)
CmdletsToExport = @()
VariablesToExport = @()
Expand Down
12 changes: 6 additions & 6 deletions OSDCloud/OSDCloud.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,13 @@ if ($FoundErrors.Count -gt 0) {

if ($env:SystemDrive -eq 'X:') {
Set-Alias -Name OSDCloudExplorer -Value Start-OSDCloudExplorer -Scope Script
New-Alias -Name Invoke-OSDCloudPEStartup -Value Invoke-WinPEStartupManager -Description 'Backward compatibility alias' -Force
New-Alias -Name Invoke-OSDCloudPEStartup -Value Invoke-WinpeStartupManager -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupDeviceInfo -Value Show-OSDCloudDeviceInfo -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupHardware -Value Show-WinPEStartupDevices -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupErrors -Value Show-WinPEStartupDeviceErrors -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupIpconfig -Value Show-WinPEStartupIpconfig -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupWifi -Value Show-WinPEStartupWifi -Description 'Backward compatibility alias' -Force
New-Alias -Name Use-PEStartupUpdateModule -Value Update-WinPEStartupModule -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupHardware -Value Show-WinpeStartupDevices -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupErrors -Value Show-WinpeStartupDeviceErrors -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupIpconfig -Value Show-WinpeStartupIpconfig -Description 'Backward compatibility alias' -Force
New-Alias -Name Show-PEStartupWifi -Value Show-WinpeStartupWifi -Description 'Backward compatibility alias' -Force
New-Alias -Name Use-PEStartupUpdateModule -Value Update-WinpeStartupModule -Description 'Backward compatibility alias' -Force
}

Export-ModuleMember -Function '*' -Alias '*' -Cmdlet '*'
Expand Down
32 changes: 16 additions & 16 deletions OSDCloud/core/PSDefaultParameterValues.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
{
"Invoke-WinPEStartup:SkipOnScreenKeyboard": false,
"Invoke-WinPEStartup:ShowPnpDevices": false,
"Invoke-WinPEStartup:ShowPnpErrors": false,
"Invoke-WinPEStartup:SkipWiFi": false,
"Invoke-WinPEStartup:SkipIPConfig": false,
"Invoke-WinPEStartup:InstallModule": [],
"Invoke-WinPEStartup:SkipUpdateOSDCloud": false,
"Invoke-WinPEStartup:InvokeStartupCommand": [],
"Invoke-WinPEStartup:InvokeStartupCommandNoExit": false,
"Invoke-WinPEStartup:InvokeStartupCommandEA": "Continue",
"Invoke-WinPEStartup:InvokeMainCommand": [
"Invoke-WinpeStartup:SkipOnScreenKeyboard": false,
"Invoke-WinpeStartup:ShowPnpDevices": false,
"Invoke-WinpeStartup:ShowPnpErrors": false,
"Invoke-WinpeStartup:SkipWiFi": false,
"Invoke-WinpeStartup:SkipIPConfig": false,
"Invoke-WinpeStartup:InstallModule": [],
"Invoke-WinpeStartup:SkipUpdateOSDCloud": false,
"Invoke-WinpeStartup:InvokeStartupCommand": [],
"Invoke-WinpeStartup:InvokeStartupCommandNoExit": false,
"Invoke-WinpeStartup:InvokeStartupCommandEA": "Continue",
"Invoke-WinpeStartup:InvokeMainCommand": [
"Show-OSDCloudDeviceInfo"
],
"Invoke-WinPEStartup:InvokeMainCommandNoExit": true,
"Invoke-WinPEStartup:InvokeMainCommandEA": "Continue",
"Invoke-WinPEStartup:InvokeShutdownCommand": [],
"Invoke-WinPEStartup:InvokeShutdownCommandNoExit": false,
"Invoke-WinPEStartup:InvokeShutdownCommandEA": "Continue"
"Invoke-WinpeStartup:InvokeMainCommandNoExit": true,
"Invoke-WinpeStartup:InvokeMainCommandEA": "Continue",
"Invoke-WinpeStartup:InvokeShutdownCommand": [],
"Invoke-WinpeStartup:InvokeShutdownCommandNoExit": false,
"Invoke-WinpeStartup:InvokeShutdownCommandEA": "Continue"
}
6 changes: 3 additions & 3 deletions OSDCloud/core/winpestartup-profiles/OSDCloud.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
"WINPESTARTUP_AUTHOR": "OSDeploy",
"WINPESTARTUP_PROFILE": "OSDCloud"
},
"Invoke-WinPEStartup:InvokeMainCommand": [
"Invoke-WinpeStartup:InvokeMainCommand": [
"Show-OSDCloudDeviceInfo",
"Deploy-OSDCloud"
],
"Invoke-WinPEStartup:InvokeMainCommandNoExit": true,
"Invoke-WinPEStartup:InvokeMainCommandEA": "Continue"
"Invoke-WinpeStartup:InvokeMainCommandNoExit": true,
"Invoke-WinpeStartup:InvokeMainCommandEA": "Continue"
}
Loading
Loading