From f4e9af9acbcbaacb3255c0fdc80591652e671da6 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:07:09 -0500 Subject: [PATCH] CmdPal: Windows Terminal extension failing when LOCALAPPDATA environment variable is missing (#42326) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes an issue where the Command Palette Windows Terminal Profiles extension throws an `ArgumentNullException` when the `LOCALAPPDATA` environment variable is missing or corrupted. ## Problem The extension uses `Environment.GetEnvironmentVariable("LOCALAPPDATA")` to locate Windows Terminal settings files. When this environment variable is missing or corrupted (though rare), the method returns `null`, which then causes `Path.Combine()` to throw an exception: ``` System.ArgumentNullException: Value cannot be null. (Parameter 'paths') at System.IO.Path.Combine(ReadOnlySpan`1 paths) at Microsoft.CmdPal.Ext.WindowsTerminal.Helpers.TerminalQuery.GetTerminals() ``` ## Solution Replace `Environment.GetEnvironmentVariable("LOCALAPPDATA")` with the more robust `Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)`. This API: - Returns the correct path even when environment variables are corrupted - Never returns `null` for standard special folders - Is already used elsewhere in PowerToys (e.g., `Wox.Plugin.Constant.cs`) ## Changes - Updated `Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs` ## Testing The fix follows the existing pattern used in the codebase and directly addresses the exception in the reported stack trace. While unlikely to affect most users (environment variable corruption is rare), this makes the extension more resilient to edge cases. Fixes microsoft/PowerToys#42322
Original prompt > > ---- > > *This section details on the original issue you should resolve* > > CmdPal: Windows Terminal - extension fails to list profiles when env var is missing > ### Microsoft PowerToys version > > main > > ### Installation method > > Dev build in Visual Studio > > ### Area(s) with issue? > > Command Palette > > ### Steps to reproduce > > The Windows Terminal Profiles built-in extension throws an exception when environment variables are corrupted. While this is unlikely to be a widespread issue, we can strengthen the code by replacing the environment variable with `Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);`. > > ``` > ============================================================ > 😢 An unexpected error occurred in the 'Windows Terminal Profiles' extension. > > Summary: > Message: Value cannot be null. (Parameter 'paths') > Type: System.ArgumentNullException > Source: System.Private.CoreLib > Time: 2025-10-12 22:19:43.6321869 > HRESULT: 0x80004003 (-2147467261) > > Stack Trace: > at System.ArgumentNullException.Throw(String paramName) > at System.IO.Path.Combine(ReadOnlySpan`1 paths) > at Microsoft.CmdPal.Ext.WindowsTerminal.Helpers.TerminalQuery.GetTerminals()+MoveNext() > at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source) > at Microsoft.CmdPal.Ext.WindowsTerminal.Helpers.TerminalQuery.GetProfiles() > at Microsoft.CmdPal.Ext.WindowsTerminal.Pages.ProfilesListPage.Query() > at Microsoft.CmdPal.Ext.WindowsTerminal.Pages.ProfilesListPage.GetItems() > at Microsoft.CmdPal.Core.ViewModels.ListViewModel.FetchItems() > at Microsoft.CmdPal.Core.ViewModels.ListViewModel.InitializeProperties() > at Microsoft.CmdPal.Core.ViewModels.PageViewModel.InitializeAsync() > > ------------------ Full Exception Details ------------------ > System.ArgumentNullException: Value cannot be null. (Parameter 'paths') > at System.ArgumentNullException.Throw(String paramName) > at System.IO.Path.Combine(ReadOnlySpan`1 paths) > at Microsoft.CmdPal.Ext.WindowsTerminal.Helpers.TerminalQuery.GetTerminals()+MoveNext() > at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source) > at Microsoft.CmdPal.Ext.WindowsTerminal.Helpers.TerminalQuery.GetProfiles() > at Microsoft.CmdPal.Ext.WindowsTerminal.Pages.ProfilesListPage.Query() > at Microsoft.CmdPal.Ext.WindowsTerminal.Pages.ProfilesListPage.GetItems() > at Microsoft.CmdPal.Core.ViewModels.ListViewModel.FetchItems() > at Microsoft.CmdPal.Core.ViewModels.ListViewModel.InitializeProperties() > at Microsoft.CmdPal.Core.ViewModels.PageViewModel.InitializeAsync() > ℹ️ If you need further assistance, please include this information in your support request. > ℹ️ Before sending, take a quick look to make sure it doesn't contain any personal or sensitive information. > ============================================================ > ``` > > https://github.com/microsoft/PowerToys/blob/4d47659ff99aee40d7a583fd8b7898a182e641a8/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs?plain=1#L64-L78 > > ### ✔️ Expected Behavior > > _No response_ > > ### ❌ Actual Behavior > > _No response_ > > ### Additional Information > > _No response_ > > ### Other Software > > _No response_ > > ## Comments on the Issue (you are @copilot in this section) > > > >
Fixes microsoft/PowerToys#42322 --- 💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more [Copilot coding agent tips](https://gh.io/copilot-coding-agent-tips) in the docs. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jiripolasek <4773077+jiripolasek@users.noreply.github.com> --- .../Helpers/TerminalQuery.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs index f3e35e8af3..97bbae741f 100644 --- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs +++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.WindowsTerminal/Helpers/TerminalQuery.cs @@ -64,7 +64,7 @@ public class TerminalQuery : ITerminalQuery public IEnumerable GetTerminals() { var user = WindowsIdentity.GetCurrent().User; - var localAppDataPath = Environment.GetEnvironmentVariable("LOCALAPPDATA"); + var localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); foreach (var p in _packageManager.FindPackagesForUser(user.Value).Where(p => Packages.Contains(p.Id.Name))) {