Process.Start,批处理文件和报价

时间:2011-04-07 16:05:48

标签: c# process batch-file quoting

我编写了一个BAT脚本,可以自动连接和断开宽带连接:

netsh mbn connect interface="Mobile Broadband Connection" connmode=name name="My Provider" 
netsh mbn disconnect interface="Mobile Broadband Connection"

当我点击BAT脚本时,它工作正常,但当我用Process.Start执行时:

    var startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = "/c reconnect.bat",
        WindowStyle = ProcessWindowStyle.Minimized,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true
    };

    var process = new Process
    {
        StartInfo = startInfo
    };
    process.Start();

netsh返回找不到mbn命令的错误。

在我使用BAT文件之前,我直接启动了命令。它们在shell上运行良好,但在使用Process.Start时遇到了同样的错误。

为什么会发生这种情况?

输出:

  

C:\开发\ NetworkAdapterTest \ NetworkAdapterTest \ BIN \调试和GT; netsh的   mbn connect interface = \“移动   Breitbandverbindung \“connmode = name   name = \“A1 2 \”以下命令   没找到:mbn connect   interface =“Mobile Breitbandverbindung”   connmode = name name =“A1 2”。

     

C:\开发\ NetworkAdapterTest \ NetworkAdapterTest \ BIN \调试和GT; netsh的   mbn disconnect interface = \“移动   Breitbandverbindung“以下   找不到命令:mbn disconnect   interface =“Mobile Breitbandverbindung”

注意报价是如何真正接线的。当我直接启动命令时,我遇到了同样的问题。

当我使用Visual Studio 2008编译解决方案时,一切都按预期工作。

问题不再相关。

2 个答案:

答案 0 :(得分:2)

你的参数变量的内容似乎没有多大意义。如果您的程序位于“C:\ Temp”中,它将是:“C:\ Temp \ / c reconnect.bat”。
如果bat文件与应用程序位于同一文件夹中,则可能需要使用以下代码:

var arguments = string.Format("/c \"{0}\"", 
                  Path.Combine(Application.StartupPath, "reconnect.bat"));

额外的引号,以防路径中包含空格。

答案 1 :(得分:1)

您是否尝试直接启动批处理文件,而不是使用“cmd.exe”?它应该工作,而不必通过cmd.exe。

我要检查的另一件事是你正在使用正确的路径。最简单的方法是将Bat与可执行文件放在同一目录中,或者引用文件名中的完整路径。

Stack Overflow - how to execute a batch file from windows form