在调用 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,它启动一个程序并退出。它的退出代码不是它启动的程序的退出代码。怎么会这样?它甚至可能还没有开始执行,更不用说退出了。

获取脚本退出代码的最佳方法是如果它是您自己的孩子。不要使用cmdstart;使用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 获取退出代码的主要内容,如果未能解决你的问题,请参考以下文章

win10系统调用架构分析

在mfc下怎么调用一个win32控制台?并且自动向该控制台输入一段信息?

C#调用Win32 API 的方法

转换 POSIX->WIN 路径,在 Cygwin Python 中,不调用 cygpath

如何从 PHP 进行 Win32 API 调用?

minGW可以在win下调用linux库函数吗?默认情况下