【问题标题】:How do you run a program you don't know where the arguments start?你如何运行一个你不知道参数从哪里开始的程序?
【发布时间】:2008-10-20 22:46:16
【问题描述】:

题主不多说了,一句话就不好问了。 我必须执行一些从注册表中读取的程序。我必须从有人保存整个路径和参数的字段中读取。
我一直在使用 System.Diagnostics.ProcessStartInfo 设置程序的名称及其参数,但我发现了各种各样的参数,我必须解析这些参数才能将进程可执行文件保存在一个字段中,并将其参数保存在另一个字段中。

有没有办法按原样执行整个字符串?

【问题讨论】:

  • 有人可以进一步解释这个问题。显然死猫明白了,因为他的回答被接受了。他想从注册表中读取什么……一个程序,一个程序名,其他?

标签: c# .net registry system.diagnostics processstartinfo


【解决方案1】:

我已经以与上面的海报相同的方式解决了这个问题,使用带有进程启动信息的 cmd.exe。

Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();

cmd /c 执行命令,然后终止。 WaitForExit 运行时间过长会终止进程。

【讨论】:

  • 我工作!我不得不删除 waitforexit 子句,因为我正在从 UI 线程启动进程。感谢 +1 并回答
【解决方案2】:

其实有好几个。

  1. 您可以使用 /C [您的命令行] 作为参数调用 cmd.exe。这会导致 cmd.exe 处理您的命令,然后退出。
  2. 您可以将命令写入批处理文件并启动它。

当然还有你现在采用的方法,即解析命令行。

【讨论】:

  • 选项 1 是指以 cmd.exe 作为文件名和 '/c ' 作为参数启动 ProcessInfo?
  • 我认为您的意思是 ProcessStartInfo,但是是的,填写它并将其传递给 Process.Start。您可能希望将其 UseShellExecute 设置为 false 以在后台运行它。如果您不需要在命令运行时隐藏 CMD.EXE 窗口,您可以使用 Process.Start("cmd.exe","/c "+myargs)。
  • cmd窗口一直打开直到进程结束
【解决方案3】:

如果未设置“UseShellExecute”,System.Diagnostics.Process 会调用CreateProcessCreateProcessAsUser 来实际启动程序(如果您指定用户/域/密码,它将使用第二个程序)。并且这两个调用都可以将命令和文件作为单个参数。来自 MSDN:

lpApplicationName 参数可以是 空值。在这种情况下,模块名称 一定是第一个白 空格分隔的标记 lpCommandLine 字符串。 ...

lpApplication 名称映射到 ProcessStartInfo.Filename,lpCommandLine 映射到 Arguments。所以你应该去:

var processStartInfo = new ProcessStartInfo()
{
    UseShellExecute = false,
    Arguments = cmd
};
Process.Start(processStartInfo);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多