0

我正在从批处理中调用 perl 脚本并提供适当的参数,它应该返回 1、2、3 或 4。但事实并非如此。我从命令行检查了 Perl 的输出,它们输出了正确的结果,我认为它在批处理语法中

批:

@echo off 
setlocal enabledelayedexpansion
FOR /F "delims=*" %%I IN ('Perl C:/ExecutionSDKTest_10.2.2/TestProp1noRefCheck.pl 844') DO     set lineCase=%%I  
echo line case is !lineCase!

珀尔:

use strict;
use warnings;
sub main1;

my $arg1 =shift;
main1($arg1);
exit;
sub main1
{
            #Returns 1,2,3 Depending on testNum passed
            my @gp1= (829,845,851,859,864,867);
            my @gp2= (861,863,865);
            # my @gp4= (826-828,830-839,843-844,847-850,852-854,860-862,883);
    # my @gp3= (877-882,884);
            my $val1=1;
            my $val2=2;
            my $val3=3;
            my $val4=4;

            if((grep /^$arg1$/,@gp1) || ($arg1 >=822 && $arg1<=824))
            {     
                            # print "$val1\n";
                            return $val1;

            } elsif ((grep /^$arg1$/,@gp2) || ($arg1>=855 && $arg1<=858))
            {
            #print "$val2\n";
                            return $val2;
            } elsif (($arg1==884) || ($arg1>=877 && $arg1<=882))
            {
            #print "$val3\n";
                            return $val3;
            } else
            {
                #print "$val4\n";
                            return $val4;

            }

}
4

1 回答 1

0

我做了一个test.cmd这样的:

@echo off 
setlocal enabledelayedexpansion
for %%I in (%*) do (
   call perlfake %%I
   set lineCase=!ERRORLEVEL!
   echo line case [for %%I] is !lineCase!
)

然后perlfake.cmd在同一目录下创建:

@echo off 
set /a returnvalue="%1 %% 4 + 1"
REM echo (%1 mod 4) + 1 = %returnvalue%
exit /b %returnvalue%

然后调用test 1 2 3 4 844 35

结果:

line case [for 1] is 2
line case [for 2] is 3
line case [for 3] is 4
line case [for 4] is 1
line case [for 844] is 1
line case [for 35] is 4

确定实际返回值的逻辑与您的 perl 代码不同,但正如您所见,这只是假代码。

因此,通过将调用更改为:

REM call perlfake %%I
call Perl C:/ExecutionSDKTest_10.2.2/TestProp1noRefCheck.pl %%I

关于您的 Perl 脚本,当您执行以下操作时,我可以看到您正在丢弃 main1 的返回值:

main1($arg1);
exit;

你想要这样的东西:

my $result = main1($arg1);
exit $result;

像这样退出 Perl 将设置错误级别。

编辑:

我现在已经下载了 ActiveState 的 Perl 5.14.2,并更改了我的批处理以调用您的 perl 脚本,并返回 $result。现在一切正常,例如: test.cmd 844 861

回报:

line case [for 844] is 4
line case [for 861] is 2
于 2012-07-13T03:41:40.663 回答