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

本文关键字:进程 参数 无效 link86 exe 运行 | 更新日期: 2023-09-27 18:07:07

大家下午好。我接下了一个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文件。obj, file2.obj,…输出文件。链接选项

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

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

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

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

看问题的Perl部分:

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

语法错误。FILE是一个无字文件句柄。你需要在后面加一个逗号来打开下一个参数。所以,这一行应该是:

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

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

^&将被执行该程序的shell解释。在这种情况下,我假设壳层是cmd.exe^cmd.exe中的转义字符。因此,它导致下面的&被解释为一个文字字符。(请参阅,每个人都以错误的方式引用命令行参数:"当cmd转换命令行并看到^时,它忽略^字符本身并将下一个字符复制到新命令行…")

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

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读取的每一行,它打印中止标志的值。一旦设置,中止标志保持设置。