通过 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.exe
和cmd
是一样的
这并没有提供问题的答案。一旦你有足够的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 窗口 - 窗体应用程序
LINQ to Entities 无法识别方法“Double Parse(System.String)”无法转换为存储表达式 C# asp.net [重复]
在 c# (.net core) 中使用 httpclient 时无法建立 SSL 连接,但在 Postman 和 Browser 中有效