Process.Start 和 Process.StartInfo 没有正确传递参数

Process.Start and Process.StartInfo not passing arguments properly

简而言之,我正在为仿真器 MAME 编写前端,作为对 WPF 和 C# 的研究。

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

从命令行 (Windows 7) 我可以键入以下内容并让模拟器正常启动。

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 等内容来看,我在上面输入的内容应该等同于打开命令行并输入我启动此 post 时使用的命令。但如果是这样的话,那么这应该没有问题。我不确定我是否做错了什么,或者是否有更好的方法来解决这个问题。

注意:我还浏览了 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";

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

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

一些可能出错的地方:

  • 文件不存在
  • 文件 在当前工作目录 中不存在,也就是 mame 正在寻找它的地方(您可以尝试使用不存在的文件命令行中的名称作为测试。错误是否相同,则可能找不到文件。尝试使用文件的完整路径);
  • 一些权限问题,错误被程序遮挡了。

作为Sinatr suggested, you could set the current working directory using Directory.SetCurrentDirectory。请注意,此程序的当前工作目录也会受到影响,因此您可能需要考虑自己在做什么。

你最好设置你启动的进程的工作目录,使用Process.WorkingDirectory

只分配 StartInfo.Arguments 文件名是行不通的。您必须在前面加上 -File 之类的操作。这将为接收应用程序生成 2 个参数 (args[0]="-File", args[1]=filename).

以下是对我有用的方法:

ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo
{
    FileName = appFilename,
    Arguments = "-File " + viewFilename, // space char after -File
};
Process.Start(startInfo);

现在我终于开始工作了!神奇之处在于参数的前置字符串。

示例:

/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();