吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1419|回复: 9
上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
getstr88 发表于 2022-5-25 08:58 回帖奖励
本帖最后由 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();
3#
 楼主| getstr88 发表于 2022-5-25 15:14 |楼主
clinber 发表于 2022-5-25 12:02
Process process = new Process();
                process.StartInfo.WindowStyle = ProcessWindowStyle ...

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

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

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

哦 原来如此,那估计是我这个正好需要他结束了再拿
7#
wu0o0pj 发表于 2022-5-26 08:19
把所有执行的命令和逻辑写在 bat 里,包括每步执行指令和成功/失败处理方式;
过程结果和最后执行完成时,进行输出,加特征字符用来区分;
用你之前测试代码里的异步输出(绑定 OutputDataReceived 事件,解析上面输出的内容,得到你想要的内容);

这样能满足你的需求么
8#
 楼主| getstr88 发表于 2022-5-26 16:38 |楼主
无解,做不到,。结贴吧
9#
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();
10#
 楼主| getstr88 发表于 2022-5-26 20:58 |楼主
cdj68765 发表于 2022-5-26 17:57
Process Processs = new Process();
            Processs.StartInfo.FileName = @"XX.exe";
...

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

这个问题无解,结贴
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表