我有一个应用程序,用户可以在其中输入dos命令,以便稍后由服务运行。以下是用户可以输入的示例:
这很有效,但由于服务运行命令,/Q
参数必须存在,因为没有人工交互。我试图找出当/Q
缺失时服务如何正常处理。现在,服务实际挂起,必须停止(几次),然后再次启动。这是因为没有/Q
的命令最终等待用户输入。
这是运行命令的(精简)代码:
using (Process process = new Process())
{
string processOutput = string.Empty;
try
{
process.StartInfo.FileName = "file name (cmd in this case)";
process.StartInfo.Arguments = "parameters (with the \Q)";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
processOutput = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
catch (Exception ex)
{
Logger.LogException(ex);
}
catch块没有被击中。该服务暂停,直到我手动停止并启动它。
是否可以处理此方案,以便服务不会挂起?我甚至不确定该尝试什么。
答案 0 :(得分:3)
如果找不到/Q
,则可以添加process.StartInfo.Arguments = arguments.AddQuietSwitch();
:
private static Dictionary<string, string> _quietSwitchMap =
new Dictionary<string, string> { { "rmdir", "/Q" }, { "xcopy", "/y" } };
public static string AddQuietSwitch(this string input)
{
var trimmedInput = input.Trim();
var cmd = trimmedInput.Substring(0, trimmedInput.IndexOf(" "));
string switch;
if (!_quietSwitchMap.TryGetValue(cmd, out switch)) { return input; }
if (trimmedInput.IndexOf(switch, 0,
StringComparison.InvariantCultureIgnoreCase) > 0 { return input; }
return input += string.Format(" {0}", _quietSwitchMap[cmd]);
}
扩展方法:
{{1}}
答案 1 :(得分:1)
你可以追加
回显y | rmdir ......
到未提供/ Q时的命令。