PowerShell/PowerShell · critical · FileNotFoundException
{pwshPath}
Error message
{pwshPath} What it means
Thrown by the .NET global-tool shim's Main when pwsh.dll is not present at the computed platform folder (./win/pwsh.dll or ./unix/pwsh.dll relative to the entry assembly directory). The tool package was installed but the runtime payload for the current OS is missing, so it cannot launch PowerShell.
Solutions
- Reinstall the tool: dotnet tool uninstall --global PowerShell then dotnet tool install --global PowerShell.
- Verify Path.Combine(toolDir, "win"|"unix", "pwsh.dll") exists after install.
- If packaging the tool yourself, ensure both win/pwsh.dll and unix/pwsh.dll are included in the nupkg.
- Run from a clean tool directory to rule out a stale partial layout.
Example fix
// before (manual launch)
Process.Start("dotnet", pwshPath);
// after
if (!File.Exists(pwshPath))
throw new FileNotFoundException($"pwsh.dll not found at {pwshPath}. Reinstall the global tool: dotnet tool uninstall -g PowerShell; dotnet tool install -g PowerShell", pwshPath);
Process.Start("dotnet", arguments); Defensive patterns
Strategy: validation
Validate before calling
string pwshPath = Path.Combine(toolDir, OperatingSystem.IsWindows() ? "win" : "unix", "pwsh.dll");
if (!File.Exists(pwshPath))
throw new FileNotFoundException($"pwsh.dll missing at {pwshPath}. Reinstall: dotnet tool uninstall -g PowerShell; dotnet tool install -g PowerShell", pwshPath); Type guard
static bool PwshPayloadPresent(string toolDir) =>
File.Exists(Path.Combine(toolDir, OperatingSystem.IsWindows() ? "win" : "unix", "pwsh.dll")); Try / catch
try { return EntryPoint.Main(args); }
catch (FileNotFoundException ex) { Console.Error.WriteLine($"{ex.Message}. Reinstall the global tool."); return 1; } Prevention
- After dotnet tool install, verify the win/ and unix/ subfolders and pwsh.dll.
- In CI, run dotnet tool restore from a clean cache.
- Include both OS payloads when authoring a custom global-tool nupkg.
When it happens
Trigger: Running `pwsh` (dotnet global tool) after a partial/corrupt install; a custom packaging that dropped the win/ or unix/ subfolder; deploying the global-tool nupkg without bundling the OS-specific pwsh.dll.
Common situations: dotnet tool install failed mid-way and left a partial layout; the tool was copied by hand without the per-OS folder; a CI image uses a trimmed global tool package.
Related errors
- {0} {1}
- A valid Event Id must be specified.
- Argument ' ' contains characters that are not allowed in…
- {argumentName}
- Can not find method ' ' in class ' '.
AI-assisted analysis of PowerShell/PowerShell@3ff3c711bf (2026-08-13).
Data as JSON: /api/errors/79f1f29c52863227.
Report an issue: GitHub.
Appendix: source
Thrown at src/Microsoft.PowerShell.GlobalTool.Shim/GlobalToolShim.cs:52
var arguments = new List<string>(args.Length + 1);
var pwshPath = Path.Combine(currentPath, platformFolder, PwshDllName);
arguments.Add(pwshPath);
arguments.AddRange(args);
if (File.Exists(pwshPath))
{
Console.CancelKeyPress += (sender, e) =>
{
e.Cancel = true;
};
var process = System.Diagnostics.Process.Start("dotnet", arguments);
process.WaitForExit();
return process.ExitCode;
}
else
{
throw new FileNotFoundException(pwshPath);
}
}
}
}
View on GitHub (pinned to 3ff3c711bf)