当命令等待用户输入时,Process.Start()挂起服务

时间:2014-05-05 13:06:44

标签: c#

我有一个应用程序,用户可以在其中输入dos命令,以便稍后由服务运行。以下是用户可以输入的示例:

enter image description here

这很有效,但由于服务运行命令,/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块没有被击中。该服务暂停,直到我手动停止并启动它。

是否可以处理此方案,以便服务不会挂起?我甚至不确定该尝试什么。

2 个答案:

答案 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时的命令。