private ProcessStartInfo PrepareProcessStartInfo(string command, bool runAsAdministrator = false) { command = command.Trim(); command = Environment.ExpandEnvironmentVariables(command); var workingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); var runAsAdministratorArg = !runAsAdministrator && !_settings.RunAsAdministrator ? "" : "runas"; ProcessStartInfo info; if (_settings.Shell == Shell.Cmd) { var arguments = _settings.LeaveShellOpen ? $"/k \"{command}\"" : $"/c \"{command}\" & pause"; info = ShellCommand.SetProcessStartInfo("cmd.exe", workingDirectory, arguments, runAsAdministratorArg); } else if (_settings.Shell == Shell.Powershell) { string arguments; if (_settings.LeaveShellOpen) { arguments = $"-NoExit \"{command}\""; } else { arguments = $"\"{command} ; Read-Host -Prompt \\\"Press Enter to continue\\\"\""; } info = ShellCommand.SetProcessStartInfo("powershell.exe", workingDirectory, arguments, runAsAdministratorArg); } else if (_settings.Shell == Shell.RunCommand) { var parts = command.Split(new[] { ' ' }, 2); if (parts.Length == 2) { var filename = parts[0]; if (ExistInPath(filename)) { var arguments = parts[1]; info = ShellCommand.SetProcessStartInfo(filename, workingDirectory, arguments, runAsAdministratorArg); } else { info = ShellCommand.SetProcessStartInfo(command, verb: runAsAdministratorArg); } } else { info = ShellCommand.SetProcessStartInfo(command, verb: runAsAdministratorArg); } } else if (_settings.Shell == Shell.Bash && _settings.SupportWSL) { string arguments; if (_settings.LeaveShellOpen) { // FIXME: How to deal with commands containing single quote? arguments = $"-c \'{command} ; $SHELL\'"; } else { arguments = $"-c \'{command} ; echo -n Press any key to exit... ; read -n1\'"; } info = new ProcessStartInfo { FileName = "bash.exe", Arguments = arguments }; } else { throw new NotImplementedException(); } info.UseShellExecute = true; _settings.AddCmdHistory(command); return(info); }
private void Execute(string command, bool runAsAdministrator = false) { command = command.Trim(); command = Environment.ExpandEnvironmentVariables(command); ProcessStartInfo info; if (_settings.Shell == Shell.Cmd) { var arguments = _settings.LeaveShellOpen ? $"/k \"{command}\"" : $"/c \"{command}\" & pause"; info = new ProcessStartInfo { FileName = "cmd.exe", Arguments = arguments, }; } else if (_settings.Shell == Shell.Powershell) { string arguments; if (_settings.LeaveShellOpen) { arguments = $"-NoExit \"{command}\""; } else { arguments = $"\"{command} ; Read-Host -Prompt \\\"Press Enter to continue\\\"\""; } info = new ProcessStartInfo { FileName = "powershell.exe", Arguments = arguments }; } else if (_settings.Shell == Shell.RunCommand) { var parts = command.Split(new[] { ' ' }, 2); if (parts.Length == 2) { var filename = parts[0]; if (ExistInPath(filename)) { var arguemtns = parts[1]; info = new ProcessStartInfo { FileName = filename, Arguments = arguemtns }; } else { info = new ProcessStartInfo(command); } } else { info = new ProcessStartInfo(command); } } else { return; } info.UseShellExecute = true; info.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); info.Verb = runAsAdministrator ? "runas" : ""; try { Process.Start(info); _settings.AddCmdHistory(command); } catch (FileNotFoundException e) { MessageBox.Show($"Command not found: {e.Message}"); } }