diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index 3abdaf01f..908284bb9 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -29,6 +29,15 @@ namespace Flow.Launcher.Plugin
///
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 c5d43a3d9..a2eea19a7 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 @@ namespace Flow.Launcher.Plugin.SharedCommands
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 51484e53e..49788bfac 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.Infrastructure.Image;
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 @@ namespace Flow.Launcher
});
}
+ 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 e101fc544..5bf82cb10 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -263,7 +263,7 @@ namespace Flow.Launcher.Plugin.Shell
{
try
{
- startProcess(info);
+ ShellCommand.Execute(startProcess, info);
}
catch (FileNotFoundException e)
{
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
index a3f271a6f..6208fc000 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Sys/Main.cs
@@ -190,8 +190,8 @@ namespace Flow.Launcher.Plugin.Sys
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 42e8058e5..1a8f008c3 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",