为什么我从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;
}
处理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了。