运行link86.exe时C#进程参数无效
下午好每个人。我接受了以前由其他人编写的C#编程任务。该程序最初调用两个perl脚本执行。那些perl脚本在90年代被写回,并且在调用各种8086可执行文件来组装和链接.a86文件之前,基本上做了很多格式化和过滤。运行link86.exe时C#进程参数无效
在开始时我重写了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,这将非常有帮助。
感谢您在这件事情上的时间和考虑!
看问题的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:“当CMD转换命令行,看到一个^
,它忽略了^
字符本身并复制下一个字符从字面上新的命令行...”)
我不完全相信它确实,但它似乎基本上执行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
中读取的每一行,它将打印中止标志的值。一旦设置,中止标志保持置位状态。
对不起,我在文件后忘了','。所以当link86被执行时,它会一次性获得'$ tempfn'中任何文件的内容,如:'link86 file.obj,file2.obj,file3.obj ...... file95.obj'或是他们一次只读一个?我认为他们都立即去,然后link86被执行,因为所有的对象文件需要链接在一起。我一直在玩这个命令行,看来link86一次需要所有的对象文件。我将如何模仿C#中的perl功能? –
调用'“link86.exe ^&response.file”'不是Perl专用的。将它的输出配置到Perl程序中。 [如何:在C#中执行命令行,获得STD OUT结果](http://stackoverflow.com/questions/206323/how-to-execute-command-line-in-c-get-std-out-results) ......接受的答案一次性提供输出,而不是一行一行地输出,但是您应该能够根据这一点确定去哪里。另请参见[Process.StandardOutput属性](https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx) –
非常感谢!当我达到解决方案时,我将开始工作并发布信息! –
另请参阅[使用open()for IPC](https://metacpan.org/pod/perlipc#Using-open-for-IPC)。 –
思南Unur你是正确的,有两个问题。两者都导致相同的结果。我一直致力于让该程序以多线程方式执行所有这些任务,我通过将perl脚本作为不同进程执行,但GUI在执行期间冻结,从而实现了这一点。 C#似乎很善于处理文件和字符串,所以我不会抛出Perl代码,而是用一种新语言来利用它的功能。我想我对perl脚本不了解的是'^&'这类东西的作用和$ filename |确实。 –
Sinan Unur,感谢IPC链接,我现在正在阅读它.... –