岳河 2023-10-24 17:59 采纳率: 0%
浏览 11

c#程序调用cmd.exe,wsl命令执行子系统linux命令,无返回

c#程序调用cmd.exe,wsl命令执行子系统linux命令,无返回,程序卡在读取输出不返回也不提示错误
windos环境下的c#程序需要借助linux环境下的python做算法处理,所以装了wsl linux子系统,linux内写好脚本1.sh,如下:

img

命令行执行语句wsl ~ -e bash 1.sh,成功返回(虽然有点慢),如下:

img

说明,方案可行,但是,换用c#程序调用,就一直卡在读取输出不返回了

img

想要程序正常返回,即使错误也能返回,程序继续运行,不这样卡着不动。
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-24 21:27
    关注

    【以下回答由 GPT 生成】

    由于安全方面的考虑,C#程序使用Process类调用外部程序时,并不会自动将外部程序的输出返回到C#程序中。这就是为什么您的C#程序在调用cmd.exe执行wsl命令时无法得到返回值的原因。

    为了解决这个问题,您可以通过以下步骤将外部程序的输出返回给C#程序:

    1. 使用Process类调用cmd.exe,并设置RedirectStandardOutput和RedirectStandardError属性为true,以便将cmd.exe的输出和错误流重定向到C#程序。 csharp Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = "/c wsl ~ -e bash 1.sh"; ProcessStartInfo.RedirectStandardOutput = true; ProcessStartInfo.RedirectStandardError = true; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true;

    2. 订阅Process对象的OutputDataReceived和ErrorDataReceived事件,以便在接收到输出和错误数据时进行处理。 csharp process.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceivedHandler); process.ErrorDataReceived += new DataReceivedEventHandler(ErrorDataReceivedHandler);

    3. 在事件处理程序中,您可以将输出和错误数据保存到List或StringBuilder等对象中,以便稍后进行处理。 ```csharp List outputLines = new List(); List errorLines = new List();

    private void OutputDataReceivedHandler(object sender, DataReceivedEventArgs e) { if (!String.IsNullOrEmpty(e.Data)) { outputLines.Add(e.Data); } }

    private void ErrorDataReceivedHandler(object sender, DataReceivedEventArgs e) { if (!String.IsNullOrEmpty(e.Data)) { errorLines.Add(e.Data); } } ```

    1. 启动并等待外部程序执行完毕,并同时开始异步读取输出和错误流。 csharp process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit();

    2. 处理输出和错误数据,您可以在此处将数据打印到控制台、保存到文件或进行其他操作。 ```csharp Console.WriteLine("Output:"); foreach (string line in outputLines) { Console.WriteLine(line); }

    Console.WriteLine("Error:"); foreach (string line in errorLines) { Console.WriteLine(line); } ```

    使用以上步骤,您应该能够在C#程序中成功获取到wsl命令的输出和错误信息。

    请注意,调用外部命令可能存在安全风险,请确保您已经仔细检查并验证传递给cmd.exe的参数。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月24日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题