网上就没有一个能用的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 直接用ProcessStartInfo是能做到你说的效果的,使用系统自带的powershell.exe来执行ps1脚本,并设置RedirectStandardOutput、RedirectStandardError
即可 本帖最后由 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的,不符合要求 Summer大大 发表于 2022-5-23 11:03
随便找的一个代码改改就能跑,网上都举一了,你不会反三
贴一下完整代码?
你截图下一句应该是startOutputBegin吧? Summer大大 发表于 2022-5-23 11:21
string strInput = "ping -t www.baidu.com";
...
你那边能正常运行?
首先,我是得在winForm下运行。其次,把-t参数参数,使得默认ping4次停止
然后console.write 改为debug。write,最终可以debug看到,ping完毕了。程序永远退出不了,死在那里
这都是之前就遇到的情况。改另一种写法后,会导致能结束,但只有最终执行完,才输出结果,不能时时 Summer大大 发表于 2022-5-23 11:33
假死是因为
//不显示程序窗口
p.StartInfo.CreateNoWindow = true;
p.StartInfo.CreateNoWindow = true;我当然要不弹出CMD窗口,而是在C# 自己的程序窗口显示了
我把你贴的代码,即便开一个控制台程序,也根本不会出一个字
Summer大大 发表于 2022-5-23 11:39
你不加怎么确定执行完了?我需要执行三个命令。并且需要前一个的返回 本帖最后由 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();
} @Summer大大
我确定不是电脑问题。又找2个同事电脑运行。win10和win11,都和我电脑情况一样,上面贴的代码,一个字出不来 本帖最后由 getstr88 于 2022-5-23 14:25 编辑
Summer大大 发表于 2022-5-23 14:07
你调试看看卡在哪里了
没有卡。是直接就完毕了。什么都没执行,什么都没输出
如果是console程序,更明显。debug也可以看到每行都是瞬间执行完