diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 3abdaf01f4e..908284bb987 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -29,6 +29,15 @@ public interface IPublicAPI
///
void RestartApp();
+ ///
+ /// Run a shell command
+ ///
+ /// The command or program to run
+ /// the shell type to run, e.g. powershell.exe
+ /// Thrown when unable to find the file specified in the command
+ /// Thrown when error occurs during the execution of the command
+ void ShellRun(string cmd, string filename = "cmd.exe");
+
///
/// Save everything, all of Flow Launcher and plugins' data and settings
///
diff --git a/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs b/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
index c5d43a3d9df..a2eea19a720 100644
--- a/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
+++ b/Flow.Launcher.Plugin/SharedCommands/ShellCommand.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
@@ -60,17 +60,39 @@ private static string GetWindowTitle(IntPtr hwnd)
return sb.ToString();
}
- public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "")
+ public static ProcessStartInfo SetProcessStartInfo(this string fileName, string workingDirectory = "", string arguments = "", string verb = "", bool createNoWindow = false)
{
var info = new ProcessStartInfo
{
FileName = fileName,
WorkingDirectory = workingDirectory,
Arguments = arguments,
- Verb = verb
+ Verb = verb,
+ CreateNoWindow = createNoWindow
};
return info;
}
+
+ ///
+ /// Runs a windows command using the provided ProcessStartInfo
+ ///
+ /// Thrown when unable to find the file specified in the command
+ /// Thrown when error occurs during the execution of the command
+ public static void Execute(ProcessStartInfo info)
+ {
+ Execute(Process.Start, info);
+ }
+
+ ///
+ /// Runs a windows command using the provided ProcessStartInfo using a custom execute command function
+ ///
+ /// allows you to pass in a custom command execution function
+ /// Thrown when unable to find the file specified in the command
+ /// Thrown when error occurs during the execution of the command
+ public static void Execute(Func startProcess, ProcessStartInfo info)
+ {
+ startProcess(info);
+ }
}
}
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index e90a53fc3a1..d0dc548744d 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
@@ -14,6 +14,7 @@
using Flow.Launcher.Plugin;
using Flow.Launcher.ViewModel;
using Flow.Launcher.Plugin.SharedModels;
+using Flow.Launcher.Plugin.SharedCommands;
using System.Threading;
using System.IO;
using Flow.Launcher.Infrastructure.Http;
@@ -106,6 +107,14 @@ public void OpenSettingDialog()
});
}
+ public void ShellRun(string cmd, string filename = "cmd.exe")
+ {
+ var args = filename == "cmd.exe" ? $"/C {cmd}" : $"{cmd}";
+
+ var startInfo = ShellCommand.SetProcessStartInfo(filename, arguments: args, createNoWindow: true);
+ ShellCommand.Execute(startInfo);
+ }
+
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
public void StopLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Collapsed;
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index f9fc239a55d..f5cf182b66e 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -251,7 +251,7 @@ private void Execute(Func startProcess, ProcessStartI
{
try
{
- startProcess(info);
+ ShellCommand.Execute(startProcess, info);
}
catch (FileNotFoundException e)
{
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
index 6b20eeef9ef..b71dba2da25 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
@@ -4,7 +4,7 @@
"Name": "Shell",
"Description": "Provide executing commands from Flow Launcher",
"Author": "qianlifeng",
- "Version": "1.4.5",
+ "Version": "1.4.6",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index a3f271a6f6b..6208fc00060 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -190,8 +190,8 @@ private List Commands()
var info = ShellCommand.SetProcessStartInfo("shutdown", arguments:"/h");
info.WindowStyle = ProcessWindowStyle.Hidden;
info.UseShellExecute = true;
-
- Process.Start(info);
+
+ ShellCommand.Execute(info);
return true;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
index 42e8058e511..1a8f008c3ed 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
@@ -4,7 +4,7 @@
"Name": "System Commands",
"Description": "Provide System related commands. e.g. shutdown,lock, setting etc.",
"Author": "qianlifeng",
- "Version": "1.5.0",
+ "Version": "1.5.1",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Sys.dll",