繁体   English   中英

Process.Start 和 Process.StartInfo 未正确传递 arguments

[英]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");

它的行为与之前的尝试相同。

如果我不尝试将 arguments 传递给它,程序会正常启动,只是告诉我没有 ROM。 上述任何传递 arguments 的方法都会导致快速命令提示符显示相同的信息,如果 rom 的 zip 文件为空,则显示相同的信息。

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

注意:我还浏览了 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建议的那样,您可以使用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);

现在我终于开始工作了。 神奇之处在于 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM