在调用 Win32::Process::Create 之后尝试从子 shell 获取退出代码
Posted
技术标签:
【中文标题】在调用 Win32::Process::Create 之后尝试从子 shell 获取退出代码【英文标题】:Attempting to get exit codes from children shells, after a call to Win32::Process::Create 【发布时间】:2014-03-25 15:53:09 【问题描述】:为什么下面的输出是0
而不是4
?
use strict;
use warnings;
use feature qw( say );
use Win32::Process qw( NORMAL_PRIORITY_CLASS INFINITE );
Win32::Process::Create(my $ProcessObj,
$ENVCOMSPEC,
$ENVCOMSPEC.' /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
【问题讨论】:
好的,这是有道理的 - 为什么我没有看到 ERROR IN BUILD 文本,但在过程结束时,当我从内部打印它时,它显然是2
脚本?
【参考方案1】:
您正在执行的程序是cmd
。它的退出代码是它执行的最后一个命令的退出代码。
cmd
执行的最后一个程序是start
,它启动一个程序并退出。它的退出代码不是它启动的程序的退出代码。怎么会这样?它甚至可能还没有开始执行,更不用说退出了。
获取脚本退出代码的最佳方法是如果它是您自己的孩子。不要使用cmd
和start
;使用CREATE_NEW_CONSOLE
标志直接启动程序。不过,我不知道如何最小化它,但你必须搜索它。 (如果不存在 Perl 解决方案,我们可以帮助您创建一个 Perl 解决方案,并且您可以了解如何在 C 中完成它。)
【讨论】:
谢谢,现在看来很明显了 我已将 2 行更改为: $cmd = "compile.pl $dir $semaCompile $log $semaLogName $compileType $skipPDB"; Win32::Process::Create($ProcessObj,"C:\\Perl64\\bin\\wperl.exe",$cmd,0,NORMAL_PRIORITY_CLASS,".");但是现在,我只是打印了一个错误 9 。我应该为此创建一个新问题吗? 第三个参数应该是命令。使用正确的命令 ("C:\\Perl64\\bin\\wperl.exe compile.pl ..."
) 有帮助吗?
不管怎样,你又变得非常不清楚了。 “一切打印错误9”?请!!!以上是关于在调用 Win32::Process::Create 之后尝试从子 shell 获取退出代码的主要内容,如果未能解决你的问题,请参考以下文章
在mfc下怎么调用一个win32控制台?并且自动向该控制台输入一段信息?