diff --git a/packages/adapter-utils/src/server-utils.ts b/packages/adapter-utils/src/server-utils.ts index 4a5affdf..b2337abf 100644 --- a/packages/adapter-utils/src/server-utils.ts +++ b/packages/adapter-utils/src/server-utils.ts @@ -306,6 +306,12 @@ function quoteForCmd(arg: string) { return /[\s"&<>|^()]/.test(escaped) ? `"${escaped}"` : escaped; } +function resolveWindowsCmdShell(env: NodeJS.ProcessEnv): string { + const fallbackRoot = env.SystemRoot || process.env.SystemRoot || "C:\\Windows"; + const candidate = path.join(fallbackRoot, "System32", "cmd.exe"); + return candidate; +} + async function resolveSpawnTarget( command: string, args: string[], @@ -320,7 +326,9 @@ async function resolveSpawnTarget( } if (/\.(cmd|bat)$/i.test(executable)) { - const shell = env.ComSpec || process.env.ComSpec || "cmd.exe"; + // Always use cmd.exe for .cmd/.bat wrappers. Some environments override + // ComSpec to PowerShell, which breaks cmd-specific flags like /d /s /c. + const shell = resolveWindowsCmdShell(env); const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(" "); return { command: shell,