0

我正在尝试从 perl 执行 2 个 Windows 程序。我不需要它们的任何输出到 perl 中,我需要让 perl 在它之后运行,所以我最好的方法是使用 system

(部分代码)

######  Exec 1.exe and 2.exe  ################################################
system(1,"1.exe" );
system(1,"2.exe data.tmp");

2.exe 总是返回:“该进程无法访问该文件,因为它正被另一个进程使用”但脚本有效。

1.exe完美运行。

我试过了:###### Exec 1.exe 和 2.exe ############################## ## system("启动 /b 1.exe"); system("启动 /b 2.exe 数据.tmp");

结果相同。

还尝试创建一个启动 1.exe 和 2.exe 的 bat

######  Exec 1.exe and 2.exe  ################################################
system(1,"start /b 1.bat");

再次......同样的结果。

我只需要执行1.exe2.exe获取data.tmp并遵循脚本的其余部分。

4

2 回答 2

1

我猜这1.exe会创建data.tmp? 问题是在尝试访问它之前1.exe没有完成。data.tmp2.exe

如果您可以在启动前等待1.exe完成2.exe,您可以使用以下任何一种:

  1. 2.exe在进入主程序之前等待完成:

    system("1.exe");
    system("2.exe data.tmp");
    
  2. 1.exe在进入主程序之前等待完成:

    system("1.exe");
    system(1, "2.exe data.tmp");  # Don't wait for 2.exe to complete
    
  3. 在继续主程序之前不要等待:

    system(1, "1.exe & 2.exe data.tmp");  # Don't wait for this to complete
    
于 2013-10-30T13:33:51.307 回答
1

假设1.exe使用data.tmp并因此阻止它2.exe

您正在使用system(1, ). 这根本不等待过程结束。您可以尝试不1等待每个系统调用结束。在正常情况下应该可以解决您的问题。

system("1.exe" );
system(1, "2.exe data.tmp");

如果您确实需要在执行时执行某些操作1.exe,请在开始之前等待1.exe完成2.exe

my $pid = system(1, "1.exe");
... do things while 1.exe runs ...
waitpid($pid, 0);
system(1, "2.exe data.tmp");

这使您可以更好地控制何时发生的事情。

于 2013-10-30T09:53:21.890 回答