通过 C# .NET 应用程序调用时无法识别命令,但直接调用时有效

Posted

技术标签:

【中文标题】通过 C# .NET 应用程序调用时无法识别命令,但直接调用时有效【英文标题】:Command not recognized on calling through a C# .NET application but works when called directly 【发布时间】:2021-09-17 10:43:57 【问题描述】:

我在 linux 的 wine 上运行一个 .NET 应用程序。我正在尝试运行一个运行 linux 中存在的 shell 脚本的命令。这是我在 .NET 应用程序中的代码,调用命令:

           System.Diagnostics.Process process = new System.Diagnostics.Process();
           System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
           startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
           startInfo.FileName = "cmd";
           startInfo.Arguments = "/C /bin/gnome-terminal -- sh -e /bin/MyScripts/script.sh";
           process.StartInfo = startInfo;
           process.Start();

这给了我错误提示

无法将 /bin/gnome-terminal -- sh -e /bin/MyScripts/script.sh 识别为内部或外部命令、可运行程序或批处理文件。

但是,如果我尝试直接在 wine 上运行该命令,该命令可以正常工作并执行脚本。我试过像这样直接运行它:

wine cmd /c /bin/gnome-terminal -- sh -e /bin/MyScripts/script.sh

应用程序使用以下命令在 wine 上运行:

wine Application.exe

所以我假设如果该应用程序运行该命令,它将以与直接调用相同的方式被调用,那么为什么我会看到这种不一致的行为?我做错了什么,我应该对命令进行哪些更改才能通过应用程序运行?

【问题讨论】:

如果我理解正确,您的 C# 应用程序已经在 Linux(即 WSL)中运行。那么为什么不能将 startInfo.FileName 设置为 sh 并将参数设置为 -e /bin/MyScripts/script.sh 你试过cmd /c start /unix /bin/gnome-terminal ....吗?见Execute Shell Commands from Program running in WINE 我认为您不需要设置UseShellExecute = true,但有时这是您需要使Process.Start() 工作的魔杖。 【参考方案1】:

试试

startInfo.FileName = "cmd.exe";

【讨论】:

我已经尝试过了,但它给出了相同的结果。据我所知,使用cmd.execmd 是一样的 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review @NoamYizraeli:它提供了一个很好的答案。这可能是一个错误的答案——根据 OP 的 cmets,听起来可能就是这种情况。但是,如果是这样,正确的办法是否决它,就像社区的其他成员已经做过的那样。不需要删除 (source)。 @JeremyCaney 我明白了,但因为它没有帮助,而且最初假设它是作为评论,我仍然认为应该删除它 @NoamYizraeli:这不是评论;它提供了一个解决方案。这肯定不符合我自己的标准,我觉得作为答案离开是什么。但我们作为审阅者的角色是执行社区的既定标准,而不是我们自己的。如果您不同意这些标准,那么值得将问题放在元数据上。肯定有一部分贡献者同意我们应该删除,而不仅仅是投反对票、低质量、不正确和/或仅代码的答案。

以上是关于通过 C# .NET 应用程序调用时无法识别命令,但直接调用时有效的主要内容,如果未能解决你的问题,请参考以下文章

当从外部线程调用时,.net 单元测试崩溃并显示“无法通过 AppDomains 传递 GCHandle”

c# .NEt 3.5 以用户形式运行进程时无法隐藏 CMD 窗口 - 窗体应用程序

C#调用摄像头并访问西门子PLC以及在车间的可能性应用

在表适配器查询 c# 中无法识别 OFFSET 命令

LINQ to Entities 无法识别方法“Double Parse(System.String)”无法转换为存储表达式 C# asp.net [重复]

在 c# (.net core) 中使用 httpclient 时无法建立 SSL 连接,但在 Postman 和 Browser 中有效