Brief description of your issue
When a zip manifest declares NestedInstallerFiles.RelativeFilePath with forward slashes, winget joins it to the extraction directory verbatim and passes the resulting mixed-separator path to MsiInstallProduct. Windows Installer cannot open a package path containing a forward slash, so the install fails with error 2 and an empty MSI log. Normalising the separator when building the nested installer path would make this class of manifest typo harmless.
Steps to reproduce
Install Microsoft.GameInput 3.5.274, whose manifest currently has RelativeFilePath: redist/GameInputRedist.msi:
winget install --id Microsoft.GameInput --exact --version 3.5.274
Actual behavior
[CLI ] Setting installerPath to: ...\Microsoft.GameInput.3.5.274\extracted\redist/GameInputRedist.msi
[CLI ] Installer args: /quiet /norestart /log "...\Microsoft.GameInput.3.5.274-...log"
[CLI ] MsiInstallProduct installer failed: 2
[CLI ] Terminating context: 0x8a150049 at InstallFlow.cpp:239
The log file winget passes to /log is created but stays empty (2 bytes, BOM only), so the failure is invisible to anyone reading the installer log. The Application event log shows a Windows Installer transaction that opens and closes in the same second with no result event, which makes it look like the vendor MSI is at fault.
Expected behavior
The nested installer path is built with backslashes and the package installs.
Evidence that the separator is the cause
Same MSI, same machine, same elevation. Administrative extract used so that nothing is installed and the only variable is the separator:
msiexec /a "...\extracted\redist/GameInputRedist.msi" /quiet TARGETDIR=... -> 1619 (ERROR_INSTALL_PACKAGE_OPEN_FAILED)
msiexec /a "...\extracted\redist\GameInputRedist.msi" /quiet TARGETDIR=... -> 0
Installing with the all-backslash path succeeds and registers correctly:
{73E9D910-3C53-4F87-A4EB-1EE11645F494} Microsoft GameInput 3.5.274.0
MsiOpenPackage tolerates the forward slash, which is why the path looks valid under casual inspection, and the MsiInstaller 1040 event echoes the requested path rather than a validated one.
Note
The specific manifest is fixed in microsoft/winget-pkgs#438904. Filing this separately because the client side could reject or normalise such a path instead of surfacing a bare error 2, and manifest validation could flag forward slashes in RelativeFilePath.
Environment
Windows 11 Pro Education 10.0.26200
winget from Microsoft.DesktopAppInstaller, winget source index 2026.922.622.18
Brief description of your issue
When a zip manifest declares
NestedInstallerFiles.RelativeFilePathwith forward slashes, winget joins it to the extraction directory verbatim and passes the resulting mixed-separator path toMsiInstallProduct. Windows Installer cannot open a package path containing a forward slash, so the install fails with error 2 and an empty MSI log. Normalising the separator when building the nested installer path would make this class of manifest typo harmless.Steps to reproduce
Install
Microsoft.GameInput3.5.274, whose manifest currently hasRelativeFilePath: redist/GameInputRedist.msi:Actual behavior
The log file winget passes to
/logis created but stays empty (2 bytes, BOM only), so the failure is invisible to anyone reading the installer log. The Application event log shows a Windows Installer transaction that opens and closes in the same second with no result event, which makes it look like the vendor MSI is at fault.Expected behavior
The nested installer path is built with backslashes and the package installs.
Evidence that the separator is the cause
Same MSI, same machine, same elevation. Administrative extract used so that nothing is installed and the only variable is the separator:
Installing with the all-backslash path succeeds and registers correctly:
MsiOpenPackagetolerates the forward slash, which is why the path looks valid under casual inspection, and theMsiInstaller1040 event echoes the requested path rather than a validated one.Note
The specific manifest is fixed in microsoft/winget-pkgs#438904. Filing this separately because the client side could reject or normalise such a path instead of surfacing a bare error 2, and manifest validation could flag forward slashes in
RelativeFilePath.Environment