运行link86.exe时C#进程参数无效

时间:2015-08-08 01:29:07

标签: c# perl

大家下午好。我接受了以前由其他人编写的C#编程作业。该程序最初调用两个perl脚本来执行。这些perl脚本是在90年代写回来的,在调用各种8086可执行文件以组装和链接.a86文件之前,基本上做了大量的格式化和过滤。

在开始时,我重写了perl脚本以提高速度并接受来自c#程序的参数。我不太擅长解释原始脚本正在做的一些事情。

现在在C#程序中,我已经实例化了所有可执行文件的进程并且正在成功启动它们,除了运行link86.exe时我收到错误。 link86进程具有以下信息:

Process test = new Process();
ProcessStartInfo testproc = new ProcessStartInfo();
testproc.FileName = path + "\\link86.exe";
testproc.Arguments = procData; // procData is a string
test.testproc.Start();

/* I'm having trouble passing all of these objects as arguments 
 * to link86. link86 does not like the '&' being in the string, 
 * also the ' ' (space) is not required between arguments.  After 
 * 6 objects as arguments the command line returns the following error
 * 'The system cannot execute the specified program' it seems as if the
 * the command line is trying to execute the .obj file I don't know why  
 * this is.
 * The error returned by the debugger says the 'Parameter was invalid'
 */ 

procData = (in text visualizer)
file.OBJ, &
file2.OBJ, &
TO outputfile.LNK OPTIONS

procData = (when hovering over object)
"file.OBJ, &\nfile2.OBJ, &\nTO outputfile.LNK OPTIONS"

在命令行上,以下命令将一直运行,直到我输入第7个.obj文件     link86 file.obj,file2.obj,... TO outputfile.LNK OPTIONS

我查了一些关于link86.exe的信息,我发现它的命令行长度限制为127个字符。我试图将大约95个.obj文件传递给link86作为参数。

如果我能找到一种通过c#将90多个参数传递给link86的方法,那将非常有帮助。

感谢您在这件事上的时间和考虑!

1 个答案:

答案 0 :(得分:0)

查看问题的Perl部分:

open( FILE "link86 ^& < $tempfn|" ) || die "Could not run link86: $!\n";

这是语法错误。 FILE是一个简单的文件句柄。之后你需要一个逗号来表示open的下一个参数。所以,该行应该是:

open( FILE, "link86 ^& < $tempfn|" ) || die "Could not run link86: $!\n";

第二个参数是shell执行的命令。尾随管道表示命令的输出将通过FILE文件句柄传送到您的程序。

^&将由执行此程序的shell解释。在这种情况下,我假设shell是cmd.exe^cmd.exe中的转义字符。因此,它会将以下&解释为文字字符。 (另请参阅Everyone quotes command line arguments the wrong way:&#34;当cmd转换命令行并看到^时,它会忽略^字符本身并将下一个字符复制到新命令行...&#34)

我不确定它的作用,但似乎基本上使用link86中任何文件名的内容执行$tempfn

while( <LINK> )
{
    print; # what does the print without parameters do?
    if( /^(EXCEPTION|ERROR)/i ) 
    {
        $abflag = 1;
    }
    print $dlogH "\nabort Flag:  $abflag\n";
}

这是从LINK裸字文件句柄中读取的。每行存储在$_中,然后打印。如果没有参数,print会将$_的内容打印到当前选定的输出文件句柄(很可能是STDOUT)。

如果该行包含EXCEPTIONERROR,则会设置中止标志。对于从LINK读取的每一行,它会打印中止标志的值。设置后,中止标志保持设置。