为什么我从C#调用另一个程序不起作用

本文关键字:另一个 程序 不起作用 调用 为什么 | 更新日期: 2023-09-27 18:26:41

我编写了一个函数,该函数应该用引号括住一些参数,但似乎从未调用过该程序。

让我恼火的是,当我复制/粘贴控制台输出时,程序被调用得很好。

此外,如果我在for循环中所做的一切都超过了参数,那么它会非常有效。

知道我的错误在哪里吗?

public static bool callMacroProcess(String directory, String[] args, String process)
{
    String realArgs = "";
    String nextArg = "";
    foreach (String arg in args)
    {
        if (arg.StartsWith("-p="))
        {
            String tmp = arg.Substring(3);
            String argType = arg.Substring(0, 3);
            if (!String.IsNullOrWhiteSpace(tmp))
            {
                realArgs += argType + "'"" + tmp + "'" ";
            }
            else
            {
                nextArg = argType + " ";
            }
        }
        else if (!String.IsNullOrWhiteSpace(nextArg))
        {
            realArgs += nextArg + "'"" + arg + "'" ";
            nextArg = "";
        }
        else
        {
            realArgs += arg + " ";
        }
    }
    if (verbose)
    {
        Console.WriteLine("'"" + directory + process + "'" " + realArgs);
    }
    var proc = new System.Diagnostics.Process
    {
        StartInfo = new System.Diagnostics.ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = "/C '"" + directory + process + "'" " + realArgs,
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        }
    };
    proc.Start();
    return true;
}

为什么我从C#调用另一个程序不起作用

处理ProcessStartInfo的方式不正确。请尝试以下选项之一。选项之间唯一发生变化的是/c或/k,如果不尝试使用其他格式,请尝试使用。

示例:

运行程序并传递Filename参数:CMD/c write.exe c:''docs''sample.txt

运行程序并传递一个长文件名:CMD/c write.exe";c: ''sample documents''sample.txt"

程序路径中的空格:CMD/c"c: ''Program Files''Microsoft Office''Office''Winword.exe"quot;

程序路径+参数中的空格:CMD/c"c: ''Program Files''demo.cmd"quot;参数1参数2

程序路径中的空格+带空格的参数:CMD/k"c: ''batch files''demo.cmd"quot;带空格的参数1"带空格的参数2"

启动Demo1,然后启动Demo2:CMD/c"c: ''Program Files''demo1.cmd"amp"c: ''Program Files''demo2.cmd"quot;

Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo = new ProcessStartInfo("cmd", "/c " + directory + process + "'" "  + realArgs);
proc.Start();

Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo = new ProcessStartInfo("cmd", "/k " + directory + process + "'" "  + realArgs);
proc.Start();

我将进程文件夹添加到了我的PATH中。并成功尝试用以下解决方案调用程序:

public static bool callMacroProcess(String directory, String[] args, String process)
{
    String realArgs = "";
    String nextArg = "";
    foreach (String arg in args)
    {
        if (arg.StartsWith("-p="))
        {
            String tmp = arg.Substring(3);
            String argType = arg.Substring(0, 3);
            if (!String.IsNullOrWhiteSpace(tmp))
            {
                realArgs += argType + "'"" + tmp + "'" ";
            }
            else
            {
                nextArg = argType + " ";
            }
        }
        else if (!String.IsNullOrWhiteSpace(nextArg)) //si l'argument précédent était seul
        {
            realArgs += nextArg + "'"" + arg + "'" ";
            nextArg = "";
        }
        else
        {
            realArgs += arg + " ";
        }
    }
    if (verbose)
    {
        Console.WriteLine("Arguments en parametres : " + realArgs);
    }
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.CreateNoWindow = false;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo = new System.Diagnostics.ProcessStartInfo(process, realArgs);
    proc.Start();
    return true;
}

当我用引号包围一些参数时,我仍然不明白为什么用CMD调用程序不起作用。至少现在我可以用好的参数调用.exe了。