代码之家  ›  专栏  ›  技术社区  ›  Aloehart

Process.Start和Process.StartInfo未正确传递参数

  •  3
  • Aloehart  · 技术社区  · 10 年前

    简而言之,我正在为模拟器MAME编写一个前端,作为WPF和C#的研究。

    GUI已设置,它正在正确读取cfg,除了实际启动MAME之外,一切都很好。

    在命令行(Windows7)中,我可以键入以下命令并正确启动仿真器。

    c:\MAME\Emulator\mame.exe mslug.zip
    

    这将完全按照设计毫无问题地启动模拟器。然而,我已经尝试了以下所有方法。

    Process Mame = new Process(emulatorPath);
    Mame.StartInfo.Arguments = romSelected;
    Mame.Start();
    

    我使用变量和Mame.StartInfo.Arguments=“mslug.zip”

    ProcessStartInfo Mame = new ProcessStartInfo(emulatorPath);
    Mame.Arguments = romSelected;
    Process.Start(Mame);
    

    我也尝试了使用变量并将“mslug.zip”放在它的位置。

    最后,我尝试了以下方法。

    Process.Start(@"c:\Mame\emulator\mame.exe", "mslug.zip");
    

    它的作用与之前的尝试相同。

    如果我不尝试向它传递参数,程序会很好地启动,并告诉我没有rom。上述任何传递参数的方法都会导致一个快速的命令提示符,显示与rom的zip文件为空时相同的信息。

    从我读到的Process.Start之类的内容来看,我在上面键入的内容应该等同于打开命令行并输入我开始这篇文章时使用的命令。但如果是这样的话,那么这应该毫无问题。我不确定我是否做错了什么,或者是否有更好的方法来解决这个问题。

    注意:我还浏览了Windows GUI,并创建了mame.exe的快捷方式,并编辑了它的属性,以将mslug.zip作为参数传递,它也很有效,因此我所能说的不需要通过命令行完成。

    作为助手,我在应用程序的gui中有调试文本框,这些文本框使用代码中使用的变量进行更新,以验证变量是否正确。

    更新:
    我想补充一点,程序(对于那些不熟悉的人)依赖于您尝试启动的rom的文件名。这意味着传递参数mslug.zip会导致程序转到自己的rom目录(当前为C:\mame\emulator\roms)并搜索mslug.zip。我可以从系统中的任何目录运行该命令并获得相同的结果。我也可以像这样传递到rom的路径

    c:\mame\emulator\mame.exe c:\mame\emulator\roms\mslug.zip
    

    无论我在哪里运行它,这也会起作用。我已经在代码中尝试了这一点,既将路径作为变量传递,也像

    string romSelected = @"c:\mame\emulator\roms\mslug.zip";
    

    两者都以同样的方式失败。

    3 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    7 年前

    您使用的代码工作正常。它 向程序发送正确的参数。毫无疑问

    有些事情可能会出错:

    • 文件 不存在 ;
    • 文件 当前工作目录中不存在 ,也就是 mame 正在查找该文件(您可以尝试在命令行中使用不存在的文件名作为测试。如果错误相同,则可能找不到该文件。请尝试使用 文件的完整路径 );
    • 一些权限问题,该错误被程序掩盖。

    Sinatr 建议,可以使用 Directory.SetCurrentDirectory 。请注意,此程序的当前工作目录也会受到影响,因此您可能需要考虑您正在做什么。

    您最好使用 Process.WorkingDirectory .

        2
  •  1
  •   Matt    7 年前

    仅为StartInfo.Arguments分配文件名无效。你必须准备一个像-File这样的动作。这将为接收应用程序生成2个参数(args[0]=“-File”,args[1]=文件名)。

    以下是对我有用的:

    ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
    {
        FileName = appFilename,
        Arguments = "-File " + viewFilename, // space char after -File
    };
    Process.Start(startInfo);
    
        3
  •  0
  •   Wai Ha Lee captain-yossarian from Ukraine    2 年前

    现在我终于开始工作了!魔力在于args的前字符串。

    例子:

    /C Run Command and then terminate
    /K Run Command and then return to the CMD prompt.
    

    此处描述: http://ss64.com/nt/cmd.html

    下面的代码段使用CMD.exe执行DIR命令

    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.exe";
    // /K Run Command and then return to the CMD prompt.
    startInfo.Arguments = "/K dir";
    process.StartInfo = startInfo;
    process.Start();