如何用C# Process 调用CMD或powershell,在执行一个命令后,能知道执行完了
本帖最后由 getstr88 于 2022-5-26 16:38 编辑没有找到返回命令执行完的回调。但感觉理论上应该可以知道,毕竟从CMD或powershell手工执行,一个命令完后,都能出现下个命令可以执行时的提示,即打印出当前工作路径,比如 c:\ 等待用户下一个命令
补充:
以下方法都不能
1、exit事件,仅仅是在手工执行exit后触发,且不保证顺序,实际没运行完,之前命令还在执行和打印中,也会触发。况且,我要一连执行N多命令,中途不能自己加exit
2、不能通过比如CMD进程在不在判断,因为我用命令打开的第一个第三方的常驻进程,没法通过进程是否消失判定是否执行完
3、因为要持续执行多个命令,也就不能一个命令后面加exit或者前面加/C 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(); clinber 发表于 2022-5-25 12:02
Process process = new Process();
process.StartInfo.WindowStyle = ProcessWindowStyle ...
肯定不行啊。各种类似demo试过很多。你这个连多个命令都做不到 getstr88 发表于 2022-5-25 15:14
肯定不行啊。各种类似demo试过很多。你这个连多个命令都做不到
哦 我用这个能拿到命令行的结果耶 clinber 发表于 2022-5-25 15:17
哦 我用这个能拿到命令行的结果耶
waiExit能拿到结果,但也就结束了。
并且执行有些特殊的命令,会导致永远exit不了,程序也就卡死了 getstr88 发表于 2022-5-25 15:54
waiExit能拿到结果,但也就结束了。
并且执行有些特殊的命令,会导致永远exit不了,程序也就卡死了
哦 原来如此,那估计是我这个正好需要他结束了再拿 把所有执行的命令和逻辑写在 bat 里,包括每步执行指令和成功/失败处理方式;
过程结果和最后执行完成时,进行输出,加特征字符用来区分;
用你之前测试代码里的异步输出(绑定 OutputDataReceived 事件,解析上面输出的内容,得到你想要的内容);
这样能满足你的需求么 无解,做不到,。结贴吧 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(); cdj68765 发表于 2022-5-26 17:57
Process Processs = new Process();
Processs.StartInfo.FileName = @"XX.exe";
...
早已讨论过,不适合多个命令以及常驻后台任务
这个问题无解,结贴
页:
[1]