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 コードとは異なりますが、ご覧のとおり、これは偽のコードです。

したがって、呼び出しを次のように変更して、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 に答える