Perl 在调用Win32::Process::Create之后,尝试从子shell获取退出代码
为什么以下输出是Perl 在调用Win32::Process::Create之后,尝试从子shell获取退出代码,perl,winapi,multiprocessing,exit-code,Perl,Winapi,Multiprocessing,Exit Code,为什么以下输出是0而不是4 use strict; use warnings; use feature qw( say ); use Win32::Process qw( NORMAL_PRIORITY_CLASS INFINITE ); Win32::Process::Create(my $ProcessObj, $ENV{COMSPEC}, $ENV{COMSPEC}.' /c start /min perl -e"sleep 5; exit 4"', 0, NO
0
而不是4
use strict;
use warnings;
use feature qw( say );
use Win32::Process qw( NORMAL_PRIORITY_CLASS INFINITE );
Win32::Process::Create(my $ProcessObj,
$ENV{COMSPEC},
$ENV{COMSPEC}.' /c start /min perl -e"sleep 5; exit 4"',
0,
NORMAL_PRIORITY_CLASS,
'.',
)
or die $^E;
$ProcessObj->Wait(INFINITE);
$ProcessObj->GetExitCode(my $exit_code);
say $exit_code; # 0
您正在执行的程序是
cmd
。它的退出代码是它执行的最后一个命令的退出代码
最后执行的cmd
程序是start
,它启动一个程序并退出。它的退出代码不是它启动的程序的退出代码。怎么可能呢?它甚至可能还没有开始执行,更不用说退出了
获取脚本退出代码的最佳方法是,如果它是您自己的孩子。不要使用
cmd
和start
;使用CREATE\u NEW\u控制台
标志直接启动程序。我不知道如何最小化它,但是你必须搜索它。(如果不存在Perl解决方案,我们可以帮助您创建一个Perl解决方案,并让您了解如何在C中实现它。)好的,这是有道理的-但是,在过程结束时,当我从内部脚本打印它时,它显然是2
时,为什么我没有看到构建文本中的错误呢?谢谢,这看起来很明显,现在我将我的两行代码改为:$cmd=“compile.pl$dir$semacomile$log$semaLogName$compileType$skipPDB”;Win32::Process::Create($ProcessObj,“C:\\Perl64\\bin\\wperl.exe”,$cmd,0,普通\u优先级\u类,”);但现在,我只是得到一个错误9打印的一切。我应该为此创建一个新问题吗?第三个参数应该是命令。使用正确的命令(“C:\\Perl64\\bin\\wperl.exe compile.pl…”
)有帮助吗?无论如何,你又一次非常不清楚了。“一切打印错误9”?请