在c#中运行cmdline命令或手动运行-结果不一样

本文关键字:运行 结果 不一样 命令 cmdline | 更新日期: 2023-09-27 18:06:09

我的问题是,当我从命令行手动运行命令时,或者如果我在c#中运行它,我不会得到相同的结果我尝试将。odt文件转换为。rst (reStructuredText),因此我得到了正确的工具,当我自己这样做时,它可以完美地工作:只需在cmd中发送命令:"odt2rst.py input. odt2output .rst"但是当我从代码中尝试相同的时候,它不会工作。有时会超时,有时会开始但没有结束。我的意思是我得到了一半的输出。首先,只要在中间或某个地方切开。我附上我的c#代码,如果你能看到我做错了什么,请让我知道;或者你有任何解决方法

System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.FileName = "cmd.exe";
            startInfo.WorkingDirectory = txt_output.Text;
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardError = true;
            process.StartInfo = startInfo;
            process.Start();
        process.StandardInput.WriteLine(@"odt2rst.py input.odt uncut.rst");
        StreamReader k = new StreamReader(process.StandardOutput.BaseStream);
        StreamReader l = new StreamReader(process.StandardError.BaseStream);
        process.StandardInput.WriteLine(@"exit");
        MessageBox.Show(k.ReadToEnd());
        MessageBox.Show(l.ReadToEnd());

在Messageboxes中,我看到它开始工作,但它只是简单地在中间关闭。

谢谢你的帮助!

在c#中运行cmdline命令或手动运行-结果不一样

问题是刷新,数据实际上没有在进程之间发送。根据是否在交互式终端上运行程序,标准输出刷新的情况会有所不同。

行后:

process.StandardInput.WriteLine(@"exit");

试着添加这个:

process.StandardInput.Flush();

如果这还不够,那么问题是在脚本端刷新,尝试在Python脚本中添加刷新,在它产生所有输出之后。或者也可以用setvbuf。这个答案有更多关于这个。


如果问题仍然存在,最好让脚本也具有非交互模式。如果其他用途需要交互式操作,则可以使用额外的命令行开关来启用它。因此,脚本将只执行给定的转换并退出,而不从标准输入中读取任何内容。这样,您就不需要关心刷新或其他任何事情,当脚本退出时,所有内容都将刷新。如果您需要执行许多转换,那么这样做的缺点是会减慢速度,因为启动一个进程,特别是像Python解释器这样的大进程,可能会花费一些时间。

我发现Python代码本身有问题。我从Codeproject得到它,它仍处于测试阶段,因此它并不完美。当从cmdline或automatized-cmdline执行时,我仍然不知道为什么它不同,但我设法通过修改Python代码来修复它。不幸的是,没有任何评论帮助,但非常感谢你的时间,我真的很感激!