【问题标题】:Perl Script not returning any value when called from batch?从批处理调用时Perl脚本不返回任何值?
【发布时间】:2012-07-05 19:03:36
【问题描述】:

我正在从批处理中调用 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!

Perl:

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;

            }

}

【问题讨论】:

    标签: batch-file for-loop


    【解决方案1】:

    我做了一个这样的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-30
      • 2013-01-07
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2014-02-15
      相关资源
      最近更新 更多