Merge pull request #1205 from Flow-Launcher/fix_cmd_command_with_blank

Fix shell cmd command with quote and space
This commit is contained in:
Jeremy Wu 2022-06-22 08:10:08 +10:00 committed by GitHub
commit b0f9b488b3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -61,24 +61,26 @@ namespace Flow.Launcher.Plugin.Shell
if (basedir != null) if (basedir != null)
{ {
var autocomplete = Directory.GetFileSystemEntries(basedir). var autocomplete =
Select(o => dir + Path.GetFileName(o)). Directory.GetFileSystemEntries(basedir)
Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) && .Select(o => dir + Path.GetFileName(o))
!results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase)) && .Where(o => o.StartsWith(cmd, StringComparison.OrdinalIgnoreCase) &&
!results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase))).ToList(); !results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase)) &&
!results.Any(p => o.Equals(p.Title, StringComparison.OrdinalIgnoreCase))).ToList();
autocomplete.Sort(); autocomplete.Sort();
results.AddRange(autocomplete.ConvertAll(m => new Result results.AddRange(autocomplete.ConvertAll(m => new Result
{ {
Title = m, Title = m,
IcoPath = Image, IcoPath = Image,
Action = c => Action = c =>
{ {
var runAsAdministrator = ( var runAsAdministrator =
c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed && c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed && !c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed !c.SpecialKeyState.WinPressed;
);
Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator)); Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator));
return true; return true;
@ -113,12 +115,11 @@ namespace Flow.Launcher.Plugin.Shell
IcoPath = Image, IcoPath = Image,
Action = c => Action = c =>
{ {
var runAsAdministrator = ( var runAsAdministrator =
c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed && c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed && !c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed !c.SpecialKeyState.WinPressed;
);
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
return true; return true;
@ -143,12 +144,11 @@ namespace Flow.Launcher.Plugin.Shell
IcoPath = Image, IcoPath = Image,
Action = c => Action = c =>
{ {
var runAsAdministrator = ( var runAsAdministrator =
c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed && c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed && !c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed !c.SpecialKeyState.WinPressed;
);
Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator)); Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator));
return true; return true;
@ -168,12 +168,11 @@ namespace Flow.Launcher.Plugin.Shell
IcoPath = Image, IcoPath = Image,
Action = c => Action = c =>
{ {
var runAsAdministrator = ( var runAsAdministrator =
c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed && c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed && !c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed !c.SpecialKeyState.WinPressed;
);
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator)); Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
return true; return true;
@ -203,8 +202,21 @@ namespace Flow.Launcher.Plugin.Shell
case Shell.Cmd: case Shell.Cmd:
{ {
info.FileName = "cmd.exe"; info.FileName = "cmd.exe";
info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c"); info.Arguments = $"{(_settings.LeaveShellOpen ? "/k" : "/c")} {command}";
info.ArgumentList.Add(command);
//// Use info.Arguments instead of info.ArgumentList to enable users better control over the arguments they are writing.
//// Previous code using ArgumentList, commands needed to be seperated correctly:
//// Incorrect:
// info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c");
// info.ArgumentList.Add(command); //<== info.ArgumentList.Add("mkdir \"c:\\test new\"");
//// Correct version should be:
//info.ArgumentList.Add(_settings.LeaveShellOpen ? "/k" : "/c");
//info.ArgumentList.Add("mkdir");
//info.ArgumentList.Add(@"c:\test new");
//https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.argumentlist?view=net-6.0#remarks
break; break;
} }
@ -366,7 +378,7 @@ namespace Flow.Launcher.Plugin.Shell
Title = context.API.GetTranslation("flowlauncher_plugin_cmd_run_as_different_user"), Title = context.API.GetTranslation("flowlauncher_plugin_cmd_run_as_different_user"),
Action = c => Action = c =>
{ {
Task.Run(() =>Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title))); Task.Run(() => Execute(ShellCommand.RunAsDifferentUser, PrepareProcessStartInfo(selectedResult.Title)));
return true; return true;
}, },
IcoPath = "Images/user.png" IcoPath = "Images/user.png"
@ -396,4 +408,4 @@ namespace Flow.Launcher.Plugin.Shell
return resultlist; return resultlist;
} }
} }
} }