diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 3f2248935a1a143da9b61a55d291359a4662d5e6..5b194467cee34ff4c5bd18c6ea23b221e7b7d25b 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -75,6 +75,10 @@ export function terminateProcess(process: ChildProcess, cwd?: string): Terminate return { success: true }; } +export function getWindowsShell(): string { + return process.env['comspec'] || 'cmd.exe'; +} + export abstract class AbstractProcess { private cmd: string; private module: string; @@ -233,7 +237,7 @@ export abstract class AbstractProcess { } else { args.push(commandLine.join(' ')); } - childProcess = spawn('cmd.exe', args, options); + childProcess = spawn(getWindowsShell(), args, options); } else { if (this.cmd) { childProcess = spawn(this.cmd, this.args, this.options); @@ -321,7 +325,7 @@ export abstract class AbstractProcess { if (!this.shell || !Platform.isWindows) { c(false); } - let cmdShell = spawn('cmd.exe', ['/s', '/c']); + let cmdShell = spawn(getWindowsShell(), ['/s', '/c']); cmdShell.on('error', (error:Error) => { c(true); }); diff --git a/src/vs/workbench/parts/execution/electron-browser/executionService.ts b/src/vs/workbench/parts/execution/electron-browser/executionService.ts index 62aa1f9776f00c1443b8e8e12f25c7061fa3a115..a10feecd52d85172bd8b1ba2f79ca81a1538fe1d 100644 --- a/src/vs/workbench/parts/execution/electron-browser/executionService.ts +++ b/src/vs/workbench/parts/execution/electron-browser/executionService.ts @@ -15,6 +15,7 @@ import exec = require('vs/workbench/parts/execution/common/execution'); import uri from 'vs/base/common/uri'; import cp = require('child_process'); +import processes = require('vs/base/node/processes'); export class AbstractExecutionService implements exec.IExecutionService { public serviceId = exec.IExecutionService; @@ -66,12 +67,14 @@ export class WinExecutionService extends AbstractExecutionService { return new TPromise((c, e, p) => { - // we use `start` to get another cmd.exe where `& pause` can be handled + const shell = processes.getWindowsShell(); + + // we use `start` to get another shell where `& pause` can be handled args = [ '/c', 'start', '/wait', - 'cmd.exe', + shell, '/c', strings.format('"{0} {1} & pause"', file, args.join(' ')) ]; @@ -79,7 +82,7 @@ export class WinExecutionService extends AbstractExecutionService { options = options || {}; (options).windowsVerbatimArguments = true; - childProcess = cp.spawn('cmd.exe', args, options); + childProcess = cp.spawn(shell, args, options); childProcess.on('exit', c); childProcess.on('error', e); diff --git a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts index be2df4c492cc0cc9c7e72b7fef33e334df85a940..1b381b5d9977b937f6f105a92c931c007f8cb725 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminalService.ts @@ -13,6 +13,7 @@ import {IConfigurationService} from 'vs/platform/configuration/common/configurat import {IMessageService} from 'vs/platform/message/common/message'; import cp = require('child_process'); +import processes = require('vs/base/node/processes'); export class WinTerminalService implements ITerminalService { public serviceId = ITerminalService; @@ -24,7 +25,7 @@ export class WinTerminalService implements ITerminalService { } public openTerminal(path: string): void { - cp.spawn('cmd.exe', ['/c', 'start', '/wait'], { cwd: path }); + cp.spawn(processes.getWindowsShell(), ['/c', 'start', '/wait'], { cwd: path }); } }