FreeSql.Tools icon indicating copy to clipboard operation
FreeSql.Tools copied to clipboard

C#使用Process调用cmd命令生成代码时程序异常退出

Open Lc3586 opened this issue 3 years ago • 1 comments

异常信息: `

Unhandled exception. System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read. at System.ConsolePal.ReadKey(Boolean intercept) at System.Console.ReadKey() at Colorful.Console.ReadKey() at FreeSql.Generator.ConsoleApp..ctor(String[] args, ManualResetEvent wait) in C:\Users\28810\Desktop\github\FreeSql\Extensions\FreeSql.Generator\ConsoleApp.cs:line 331 at FreeSql.Generator.Program.<>c__DisplayClass0_0.<Main>b__0() in C:\Users\28810\Desktop\github\FreeSql\Extensions\FreeSql.Generator\Program.cs:line 16 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location --- at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

`

ExitCode: -532462766

部分代码: `

    /// <summary>
    /// 调用命令
    /// </summary>
    /// <param name="cmd">命令</param>
    /// <param name="arguments">参数</param>
    /// <param name="workingDirectory">工作目录</param>
    /// <returns></returns>
    async Task<string> CallCmd(string cmd, string arguments = null, string workingDirectory = null)
    {
        using var process = GetCmdProcess(arguments, workingDirectory);
        process.Start();

        process.StandardInput.WriteLine($"{cmd.TrimEnd('&')}&exit");
        process.StandardInput.AutoFlush = true;

        var output = await process.StandardOutput.ReadToEndAsync();
        var error = process.StandardError.ReadToEnd();

        #if DEBUG
        Console.Write(output);
        Console.Write(error);
        #endif

        process.WaitForExit();

        if (!error.IsNullOrWhiteSpace())
            throw new ApplicationException(error);

        return output;
    }

    /// <summary>
    /// 获取进程
    /// </summary>
    /// <param name="arguments">参数</param>
    /// <param name="workingDirectory">工作目录</param>
    /// <returns></returns>
    Process GetCmdProcess(string arguments, string workingDirectory = null)
    {
        var process = new Process();
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        process.StartInfo.RedirectStandardInput = true;
        //process.StartInfo.StandardInputEncoding = new UTF8Encoding(true);
        process.StartInfo.RedirectStandardOutput = true;
        //process.StartInfo.StandardOutputEncoding = new UTF8Encoding(true);
        process.StartInfo.RedirectStandardError = true;
        //process.StartInfo.StandardErrorEncoding = new UTF8Encoding(true);

        if (Config.CurrentOS == OSPlatform.Windows)
            process.StartInfo.FileName = "cmd.exe";
        else if (Config.CurrentOS == OSPlatform.Linux || Config.CurrentOS == OSPlatform.OSX)
            process.StartInfo.FileName = Environment.GetEnvironmentVariable("SHELL");
        else
            throw new ApplicationException("不支持在当前操作系统执行此操作.");

        process.StartInfo.Arguments = arguments;
        if (!workingDirectory.IsNullOrWhiteSpace())
            process.StartInfo.WorkingDirectory = workingDirectory;

        return process;
    }

`

方法调用: `

var cmd = "FreeSql.Generator -Razor "D:\RazorTemplates\实体类+特性+导航属性(支持子父级结构).cshtml" -NameSpace "Entitys" -DB "Oracle,user id=;password=;data source=//:1521/ORCL;Pooling=true;Max Pool Size=500;" -Output "D:\Entitys.Project\Time_132805582083134656"";

await CallCmd(cmd, null, AppContext.BaseDirectory);

`

Lc3586 avatar Nov 05 '21 04:11 Lc3586

cs类文件全部成功生成了,只是程序退出时会报错。

Lc3586 avatar Nov 05 '21 04:11 Lc3586