在不显示CMD命令窗口的情况下运行CMD命令?

11

我创建了一个用于在CMD中运行命令的进程。

var process = Process.Start("CMD.exe", "/c apktool d app.apk");
process.WaitForExit();

如何在不显示CMD窗口的情况下运行此命令?


13
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 翻译为:进程.启动信息.窗口样式 = 进程窗口样式.隐藏。 - Daniel Abou Chleih
1
@DanielAbouChleih 看起来那可能是一个“答案”... - crashmstr
CMD窗口仍在显示。 - orglce
2
更好的做法是直接执行该进程,而不是尝试运行命令提示符。你可能仍然会遇到同样的提示问题,但我认为这种重复做法是多余的。很可能是apktool自己启动了一个窗口,因此标准修复方法不起作用。直接运行它应该能解决这个问题。 - Gray
2
我们应该阅读代码,他在初始化对象时启动了进程,因此属性不会被识别。我们真是太丢人了 :/ - Daniel Abou Chleih
显示剩余3条评论
5个回答

11

您可以使用WindowsStyle属性来指示该进程是在最大化、最小化、普通(既非最大化也非最小化)窗口中启动,还是不可见的

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

来源: 属性:MSDN 枚举:MSDN

将您的代码更改为以下内容,因为在初始化对象时启动了进程,所以在设置属性之后启动的进程不会被识别。

Process proc = new Process();
proc.StartInfo.FileName = "CMD.exe";
proc.StartInfo.Arguments = "/c apktool d app.apk";
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
proc.WaitForExit();

这与@sino的回答没有任何区别。 这是如何工作的? - gunr2171
1
@gunr2171 他在初始化对象时启动了进程,因此属性(在启动进程后设置)将不被识别。 - Daniel Abou Chleih

6

根据各位的评论和回答,您的程序存在几个问题。我在此尝试解决所有问题。

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "apktool";

//join the arguments with a space, this allows you to set "app.apk" to a variable
psi.Arguments = String.Join(" ", "d", "app.apk");

//leave it to the application, not the OS to launch the file
psi.UseShellExecute = false;

//choose to not create a window
psi.CreateNoWindow = true;

//set the window's style to 'hidden'
psi.WindowStyle = ProcessWindowStyle.Hidden;

var proc = new Process();
proc.StartInfo = psi;
proc.Start();
proc.WaitForExit();

主要问题:

  • 不必要时使用cmd /c
  • 在启动应用程序时未设置隐藏属性

2
尝试这个:

试一试:

     proc.StartInfo.CreateNoWindow = true;
     proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
     proc.WaitForExit(); 

2
那是不可能的,请在这里编写您的代码,或者更新您的问题。 - sino
@orglce,你尝试过在@sino的代码中使用process.StartInfo.UseShellExecute = false;吗? - Alezis

0

试试这个:

Process myProcess = new Process();
myProcess.StartInfo.CreateNoWindow = true;

此外,阅读文档

-1
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.FileName = "dcm2jpg.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "-f j -o \"" + ex1 + "\" -z 1.0 -s y " + ex2;

4
添加额外的内容,无论这些内容来自何处,都会使得这个答案有点混乱,特别是没有解释代码在做什么。 - Gray
3
博客中稍作解释可以起到很大的作用。 - gunr2171
1
@Dimo 我不能强迫你这么做,我只是提供一些改进你答案的建议。这就是这个网站的目的 - 社区共同解决这样的问题。它不是关于喂食,而是提供写得好、有帮助、清晰和完整的答案。 - Gray
1
一些相关的元讨论。请记住,我们不仅为 OP 的上下文编写答案,还为将来有相同问题的访问者(具有不同水平的能力)编写答案。 - Anthony Neace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接