.Net核心开放式外部终端

时间:2017-07-28 21:07:03

标签: c# terminal .net-core

我将批处理脚本迁移到.Net核心,我试图从当前终端打开另一个终端并运行命令(我不需要stderr o stout)。

批处理只需要此命令:start cmd /K gulp。我试图用.Net核心做同样的事情,但只找到了在当前终端内运行命令的方法。

private static string Run (){
    var result = "";
    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = $"/c \"gulp browserSync\"";
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardError = true;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = true;

        using (Process process = Process.Start(startInfo))
        {
            result = process.StandardError.ReadToEnd();
            process.WaitForExit();
        }
    }
    catch (Exception Ex)
    {
        Console.WriteLine(Ex.Message);
        Console.ReadKey();
    }
    return result;
}

我尝试更改此属性以便在另一个终端中打开:

startInfo.RedirectStandardOutput = false;
startInfo.RedirectStandardError = false;
startInfo.UseShellExecute = true;

但是例外:

  

UseShellExecute必须始终设置为false。

2 个答案:

答案 0 :(得分:1)

来自MSDN docs

  

如果UserName属性不为null或为空字符串,则UseShellExecute必须为false,否则在调用Process.Start(ProcessStartInfo)方法时将抛出InvalidOperationException。

startInfo.UserName = null;

编辑:我不确定你为什么要传递参数,但如果你想要的只是一个新的CMD窗口,试试这个:

try
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        WorkingDirectory = @"C:/users/replace/where_gulp_is_located",
        Arguments = @"/c gulp", // add /K if its required, I don't know if its for gulp for to open a new cmd window
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    Process proc = new Process();
    proc.StartInfo = startInfo;
    proc.Start();

    if (showOut)
    { ///code }

}catch(Exception ex)
{
    Console.WriteLine(ex);
}

在这种情况下,您不需要startInfo.UserName,因为您正在指定工作目录。

答案 1 :(得分:1)

感谢@ bender-bending的回答,我找到了解决问题的方法。由于安全限制需要用户/密码凭证才能使当前终端自动打开新的终端。

需要WorkingDirectory,用户,密码和域名 不创建窗口,重定向输出和重定向错误必须为false,以便在新窗口中查看命令结果。

public static void Sample(){
    try
    {
        Console.Write("Password: ");
        StringBuilder password = new StringBuilder();
        while (true)
        {
            var key = System.Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter) break;
            password.Append(key.KeyChar);
        }

        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            WorkingDirectory = "C:/path_to/Gulp",
            Arguments = $"/c \"gulp browserSync\"",
            UseShellExecute = false,
            RedirectStandardOutput = false,
            RedirectStandardError = false,
            UserName = Machine.User(),
            PasswordInClearText = password.ToString(),
            Domain = Machine.Domain(),
            CreateNoWindow = false
        };

        Process proc = new Process();
        proc.StartInfo = startInfo;
        proc.Start();
        //proc.WaitForExit();
    } catch (Exception ex)
    {
        System.Console.WriteLine(ex);
        System.Console.ReadKey();
    }
}

.Net Core没有获取用户和域的方法。我们可以使用这个类从环境变量中获取这些值。

public static class Machine 
{
    public static string User(){
        return Environment.GetEnvironmentVariable("USERNAME") ?? Environment.GetEnvironmentVariable("USER");
    }

    public static string Domain(){
        return Environment.GetEnvironmentVariable("USERDOMAIN") ?? Environment.GetEnvironmentVariable("HOSTNAME");
    }
}

希望它有所帮助!