从Windows命令行输入2项执行Perl脚本

时间:2018-10-02 15:29:07

标签: windows bash perl command-line cmd

这是我的Perl脚本

use strict;
use warnings;
use XML::Twig;
use Data::Dumper;

sub xml2array{
my $path = shift; 
my $twig = XML::Twig->new->parsefile($path); 
return map { $_ -> att('VirtualPath') } $twig -> get_xpath('//Signals');
} 

sub compareMappingToArray {
my $mapping = shift;
my $signalsRef = shift; 
my $i = 1;

print "In file : $mapping\n";

open(my $fh, $mapping);
while (my $r = <$fh>) {
    chomp $r; 


    if ($r =~ /\'(ModelSpecific.*)\'/) {
        my $s = $1;


        my @matches = grep { /^$s$/ } @{$signalsRef};

        print "line $i : not found - $s\n" if scalar @matches ==0;
        print "line $i : multiple $s\n" if scalar @matches > 1;
    }

    $i = $i + 1 # keep line index
 }
}

my $mapping = "C:/Users/HOR1DY/Desktop/Global/TA_Mapping/CAN/CAN_ESP_002_mapping.pm";      
my @virtualpath = xml2array("SignalModel.xml");
compareMappingToArray($mapping,  \@virtualpath);

该脚本运行良好,其目的是比较文件“ SignalModel.xml”和“ CAN_ESP_002_mapping.pm”,并将不匹配的行放入.TXT文件中。 .TXT文件的外观如下:

In file : C:/Users/HOR1DY/Desktop/Global/TA_Mapping/CAN/CAN_ESP_002_mapping.pm
line 331 : not found - ModelSpecific.EID.NET.CAN_Engine.VCU.Transmit.VCU_202.R2B_VCU_202__byte_3
line 348 : not found - ModelSpecific.EID.NET.CAN_Engine.CMM_WX.Transmit.CMM_HYB_208.R2B_CMM_HYB_208__byte_2
line 368 : not found - ModelSpecific.EID.NET.CAN_Engine.VCU.Transmit.VCU_222.R2B_VCU_222__byte_0

但是对于此脚本,我将需要比较的两个文件放在了代码内部,而不是这样做,我想在Windows cmd行中运行脚本,并具有以下内容:

C:\Users>perl CANMappingChecker.pl -'file 1' 'file 2'

所有文件都位于.zip文件中,因此,如果我可以执行他进入的脚本并获取我需要比较的2个文件,那么它应该是完美的。 我真的不知道该怎么做以及在cmd窗口中将其放入脚本的内容。谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

程序(或脚本)参数存储在@ARGV数组中。如果shiftpop不带任何参数,则在子对象外部使用@ARGV时,它们将在@_上工作。

有关压缩文件的信息,请参见Archive::Zip