Perl系统()调用失败,返回码为65280

我下面的代码,我可以运行$ retCode = ClearCase($ cmd); 没有错误,但运行时返回65280:$ retCode = ClearCase($ logcmd); 我在XP和Windows 2003服务器上试过,结果都一样,都是用ActiveState Perl v5.14.2。

这个代码在2年前在其他地方工作。

谢谢吉荣

$g_HPPC_DEV_DRIVE = "M"; $g_HPPC_DEV_VIEW = "bldforge_AOMS_DEV"; $g_logfile = "logfile.txt"; $cmd = "startview $g_HPPC_DEV_VIEW"; $logcmd = $cmd . " >> $g_logfile 2>>&1"; $targetDir = $g_HPPC_DEV_DRIVE . ":\\" . $g_HPPC_DEV_VIEW; print "\$targetDir = $targetDir\n"; print "Starting view .......\n"; #$retCode = system("cleartool startview bldforge_AOMS_DEV >> logfile.txt"); #$retCode = `cleartool startview bldforge_AOMS_DEV`; $retCode = ClearCase($logcmd); #$retCode = ClearCase($cmd); sub ClearCase { my $retCode = 0; my $args = $_[0]; my $cmd = "cleartool " . $args; $retCode = Execute($cmd); return $retCode; } sub Execute { my $retCode = 0; my $cmd = $_[0]; if ($g_HPPC_BUILD_SIMULATION ne "Y") { print("Execute() Running...: $cmd\n"); $retCode = system($cmd); #$retOut = `$cmd`; #$retCode = $?; #print("Command execute output: $retOut\n"); } else { print("Execute() *** SIMULATION: $cmd\n"); } print("Execute() retCode = $retCode, $cmd\n"); return $retCode; } 

在使用cleartool的时候,最好确保使用ccperl ( 现在叫做 ccperl ),即用ClearCase打包的perl,而不是最新的Active Perl ( 实际上是5.14.2 )。

因此,默认情况下,不是启动perl脚本,而是选择%PATH%可用的第一个perl.exe ,尝试使用ClearCase中包含的perl之一调用它:

  • ratlperl :在C:\Program Files\Rational\Common
  • 或传统的ccperl :在C:\Program Files\Rational\ClearCase\bin

看看错误是否持续。

根本原因是一个PATH问题:几个perl可用:

  • 来自Rational ClearCase的
  • 来自Active Perl的

通过确保PATH只引用一个perl (ClearCase附带的一个),脚本可以成功启动。

请记住,如perldoc -f系统中所记录的, 系统的返回值“ …是等待调用返回的程序的退出状态。要获得实际的退出值,请右移8 … ”。 将65280移动8就会得到255。

但不幸的是,这也不是非常有用,因为据我所知,每个可能的cleartool退出代码的确切含​​义没有记录。 我能找到的最接近的是cleartool文档中的这个链接,其中指出:“ 单命令模式的退出状态取决于命令是成功的(零退出状态)还是生成了错误消息(非零退出状态)。

所以你有它; 255是一个非零退出状态,表示错误状态。 在光明的一面,也许它会产生一个错误信息,你只是没有看到。

作为一种故障排除技术,由于您已经打印了$cmd ,因此在命令行中使用您程序生成的相同命令调用cleartool 。 如果你得到相同的结果,这个问题就成了一个问题而不是一个Perl问题。 有一点运气,错误条件会产生一个错误信息,你可以看到,而不仅仅是一个退出代码。

另一方面,如果你得到正确的行为,开始看看Perl运行时环境和命令行环境有什么不同。 权限,环境变量,路径,工作目录等