Skip to content

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

@Lc3586

Description

@Lc3586

异常信息:
`

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.

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);

`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions