getstr88 发表于 2022-5-25 08:58

如何用C# Process 调用CMD或powershell,在执行一个命令后,能知道执行完了

本帖最后由 getstr88 于 2022-5-26 16:38 编辑

没有找到返回命令执行完的回调。但感觉理论上应该可以知道,毕竟从CMD或powershell手工执行,一个命令完后,都能出现下个命令可以执行时的提示,即打印出当前工作路径,比如 c:\ 等待用户下一个命令

补充:
以下方法都不能
1、exit事件,仅仅是在手工执行exit后触发,且不保证顺序,实际没运行完,之前命令还在执行和打印中,也会触发。况且,我要一连执行N多命令,中途不能自己加exit
2、不能通过比如CMD进程在不在判断,因为我用命令打开的第一个第三方的常驻进程,没法通过进程是否消失判定是否执行完
3、因为要持续执行多个命令,也就不能一个命令后面加exit或者前面加/C

clinber 发表于 2022-5-25 12:02

Process process = new Process();
                process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
                process.StartInfo.FileName = Path.Combine(AssemblyDirectory, "gswin64c.exe");
                process.StartInfo.Arguments = "-dSAFER -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=" + numberOfPages +
                                              " -sDEVICE=bbox \"" + fileName + "\"";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
                process.StartInfo.RedirectStandardError = true;
                process.Start();
                string result = process.StandardError.ReadToEnd();
                process.WaitForExit();
                process.Close();

getstr88 发表于 2022-5-25 15:14

clinber 发表于 2022-5-25 12:02
Process process = new Process();
                process.StartInfo.WindowStyle = ProcessWindowStyle ...

肯定不行啊。各种类似demo试过很多。你这个连多个命令都做不到

clinber 发表于 2022-5-25 15:17

getstr88 发表于 2022-5-25 15:14
肯定不行啊。各种类似demo试过很多。你这个连多个命令都做不到

哦 我用这个能拿到命令行的结果耶

getstr88 发表于 2022-5-25 15:54

clinber 发表于 2022-5-25 15:17
哦 我用这个能拿到命令行的结果耶

waiExit能拿到结果,但也就结束了。
并且执行有些特殊的命令,会导致永远exit不了,程序也就卡死了

clinber 发表于 2022-5-25 16:33

getstr88 发表于 2022-5-25 15:54
waiExit能拿到结果,但也就结束了。
并且执行有些特殊的命令,会导致永远exit不了,程序也就卡死了

哦 原来如此,那估计是我这个正好需要他结束了再拿

wu0o0pj 发表于 2022-5-26 08:19

把所有执行的命令和逻辑写在 bat 里,包括每步执行指令和成功/失败处理方式;
过程结果和最后执行完成时,进行输出,加特征字符用来区分;
用你之前测试代码里的异步输出(绑定 OutputDataReceived 事件,解析上面输出的内容,得到你想要的内容);

这样能满足你的需求么

getstr88 发表于 2022-5-26 16:38

无解,做不到,。结贴吧

cdj68765 发表于 2022-5-26 17:57

            Process Processs = new Process();
            Processs.StartInfo.FileName = @"XX.exe";
            Processs.StartInfo.UseShellExecute = false;
            Processs.StartInfo.CreateNoWindow = true;
            Processs.StartInfo.StandardOutputEncoding = Encoding.UTF8;
            Processs.StartInfo.StandardErrorEncoding = Encoding.UTF8;
            Processs.StartInfo.RedirectStandardOutput = true;
            Processs.StartInfo.RedirectStandardError = true;
            Processs.ErrorDataReceived += (o, e) =>
            {
                //运行过程中或者运行完毕后会在这里显示运行结果
            };
            Processs.Start();
            Processs.BeginErrorReadLine();
            Processs.WaitForExit();
            Processs.Close();
            Processs.Dispose();

getstr88 发表于 2022-5-26 20:58

cdj68765 发表于 2022-5-26 17:57
Process Processs = new Process();
            Processs.StartInfo.FileName = @"XX.exe";
...

早已讨论过,不适合多个命令以及常驻后台任务

这个问题无解,结贴
页: [1]
查看完整版本: 如何用C# Process 调用CMD或powershell,在执行一个命令后,能知道执行完了