getstr88 发表于 2022-5-23 08:50

网上就没有一个能用的C#调用PowerShell,执行多个耗时的命令,并实时输出过程中输...

本帖最后由 getstr88 于 2022-5-23 08:51 编辑

网上就没有一个能用的C#调用PowerShell,执行多个耗时的命令,并实时输出过程中输出的内容的例子么?
看了无数个博客、stackoverflow……
就没找到一个符合的例子
需求是:本来是在powerShell中手工调用几个第三方程序提供的命令,分别对一个文件夹最后那个所有图片进行色彩调整、裁剪、最后合并
每个命令,都耗时很长,并且处理完每个文件,它都会输出处理结果,比如:pic0失败,格式不符合要求。pic1成功,pic2成功

现在我想用C#程序,去调用powershell执行。需要依次执行三个命令,每个命令执行过程中,要实时返回几千张图片,每个的成功与否,而不是最后一下次返回,就像真的在powershell中执行那样。然后我拿到所有的结果后,自己写逻辑分析,对失败的,执行第2个命令(必然成功),也是实时返回所有结果。最后前两个执行完,自动执行第3个(所有的必然成功)
——————————————————————————————————————————
请不要没亲自试过的,随便搜一下粘贴,我可以负责任的说,下面等等一堆,都不对
https://stackoverflow.com/questions/34398023/get-powershell-commands-output-when-invoked-through-code
https://stackoverflow.com/questions/39505633/c-sharp-get-real-time-powershell-script-output
https://stackoverflow.com/questions/41640443/c-sharp-updating-text-box-with-powershell-console-details-in-real-time

liesauer 发表于 2022-5-23 09:12

直接用ProcessStartInfo是能做到你说的效果的,使用系统自带的powershell.exe来执行ps1脚本,并设置RedirectStandardOutput、RedirectStandardError
即可

getstr88 发表于 2022-5-23 10:20

本帖最后由 getstr88 于 2022-5-23 10:30 编辑

liesauer 发表于 2022-5-23 09:12
直接用ProcessStartInfo是能做到你说的效果的,使用系统自带的powershell.exe来执行ps1脚本,并设置Redirec ...
ProcessStartInfo 做不到的。连调用CMD 实时输出都做不到的。一开始我就是用ProcessStartInfo 尝试CMD都不行。就是在CMD中手工执行,能看到各个图片顺次打印是否成功。但用ProcessStartInfo 调用,即便按网上说法,注册了output的回调监听。也会发现,只有全都执行完了,才一下子给所有print的,不符合要求

getstr88 发表于 2022-5-23 11:17

Summer大大 发表于 2022-5-23 11:03
随便找的一个代码改改就能跑,网上都举一了,你不会反三

贴一下完整代码?

你截图下一句应该是startOutputBegin吧?

getstr88 发表于 2022-5-23 11:31

Summer大大 发表于 2022-5-23 11:21
   
            string strInput = "ping -t www.baidu.com";
             ...

你那边能正常运行?
首先,我是得在winForm下运行。其次,把-t参数参数,使得默认ping4次停止
然后console.write 改为debug。write,最终可以debug看到,ping完毕了。程序永远退出不了,死在那里

这都是之前就遇到的情况。改另一种写法后,会导致能结束,但只有最终执行完,才输出结果,不能时时

getstr88 发表于 2022-5-23 11:36

Summer大大 发表于 2022-5-23 11:33
假死是因为
//不显示程序窗口
p.StartInfo.CreateNoWindow = true;

p.StartInfo.CreateNoWindow = true;我当然要不弹出CMD窗口,而是在C# 自己的程序窗口显示了


我把你贴的代码,即便开一个控制台程序,也根本不会出一个字

getstr88 发表于 2022-5-23 13:08

Summer大大 发表于 2022-5-23 11:39


你不加怎么确定执行完了?我需要执行三个命令。并且需要前一个的返回

getstr88 发表于 2022-5-23 13:32

本帖最后由 getstr88 于 2022-5-23 13:33 编辑

Summer大大 发表于 2022-5-23 11:39

你这段代码,我实际运行,还是一个字都出不来

private void BtnPowerShellStart_Click(object sender, EventArgs e)
      {
            string strInput = "ping www.baidu.com";
            Process p = new Process();
            //设置要启动的应用程序
            p.StartInfo.FileName = "powershell.exe";
            //是否使用操作系统shell启动
            p.StartInfo.UseShellExecute = false;
            // 接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardInput = true;
            //输出信息
            p.StartInfo.RedirectStandardOutput = true;
            // 输出错误
            p.StartInfo.RedirectStandardError = true;
            //不显示程序窗口
            p.StartInfo.CreateNoWindow = true;
            //启动程序
            p.OutputDataReceived += (sender2, e2) =>
            {
                string outString = e2.Data;
                Debug.WriteLine(outString);
                AppendToConsole(outString);
            };
            p.Start();
            p.BeginOutputReadLine();
            p.StandardInput.WriteLine(strInput);
            p.StandardInput.AutoFlush = true;
            //p.WaitForExit();
            p.Close();
      }

public void AppendToConsole(string text)
      {
            // 让富文本框获取焦点
            RtxConsole.Focus();
            // 设置光标的位置到文本结尾
            RtxConsole.Select(RtxConsole.TextLength, 0);
            // 滚动到富文本框光标处
            RtxConsole.ScrollToCaret();
            // 追加内容
            RtxConsole.AppendText(text);
            // 换行
            RtxConsole.AppendText(Environment.NewLine);
            // 刷新UI
            RtxConsole.Refresh();
      }

getstr88 发表于 2022-5-23 13:54

@Summer大大

我确定不是电脑问题。又找2个同事电脑运行。win10和win11,都和我电脑情况一样,上面贴的代码,一个字出不来

getstr88 发表于 2022-5-23 14:23

本帖最后由 getstr88 于 2022-5-23 14:25 编辑

Summer大大 发表于 2022-5-23 14:07
你调试看看卡在哪里了
没有卡。是直接就完毕了。什么都没执行,什么都没输出


如果是console程序,更明显。debug也可以看到每行都是瞬间执行完

页: [1] 2 3 4
查看完整版本: 网上就没有一个能用的C#调用PowerShell,执行多个耗时的命令,并实时输出过程中输...