大家下午好。我接受了以前由其他人编写的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的方法,那将非常有帮助。
感谢您在这件事上的时间和考虑!
答案 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
)。
如果该行包含EXCEPTION
或ERROR
,则会设置中止标志。对于从LINK
读取的每一行,它会打印中止标志的值。设置后,中止标志保持设置。