我下面的代码,我可以运行$ 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
可用:
通过确保PATH
只引用一个perl
(ClearCase附带的一个),脚本可以成功启动。
请记住,如perldoc -f系统中所记录的, 系统的返回值“ …是等待调用返回的程序的退出状态。要获得实际的退出值,请右移8 … ”。 将65280移动8就会得到255。
但不幸的是,这也不是非常有用,因为据我所知,每个可能的cleartool
退出代码的确切含义没有记录。 我能找到的最接近的是cleartool文档中的这个链接,其中指出:“ 单命令模式的退出状态取决于命令是成功的(零退出状态)还是生成了错误消息(非零退出状态)。
所以你有它; 255是一个非零退出状态,表示错误状态。 在光明的一面,也许它会产生一个错误信息,你只是没有看到。
作为一种故障排除技术,由于您已经打印了$cmd
,因此在命令行中使用您程序生成的相同命令调用cleartool
。 如果你得到相同的结果,这个问题就成了一个问题而不是一个Perl问题。 有一点运气,错误条件会产生一个错误信息,你可以看到,而不仅仅是一个退出代码。
另一方面,如果你得到正确的行为,开始看看Perl运行时环境和命令行环境有什么不同。 权限,环境变量,路径,工作目录等