1

初心者です。次のことを行うperlスクリプトを作成しました

・「/x01/abcd/abc_logs/abcd_Logs」の下に、現在の日付までのディレクトリを「YYYYMMDD」の形式で、まだ作成していない場合は作成します。つまり、スクリプトが「2013 年 1 月 1 日」に実行されると、ディレクトリ「20130101」が上記のパスの下に作成されます。そのため、ログを検査する必要がある場合は常に、現在の日付までにディレクトリを探します。

-ログ ファイルが同じ日にダウンロードされているかどうかを確認します。ダウンロードされていない場合、ログは TODAY のディレクトリにダウンロードされます。

共有にファイルがないときにメッセージを出力する解決策を考え出すのに苦労しています。これはもちろん、ユーザーが共有に存在しない 2 つ以上のファイルを指定した場合です。「sub get_LOGS」に「die」ステートメントがあるため、これが発生することはわかっています。指定したすべてのファイルがたまたま共有にない場合にメッセージを返す方法を理解できないようです。

このスクリプトの使い方は次のとおりです

./abc_logs ....<ファイル(n)>

以下はスクリプトです。

my $LOGS_LOCAL_PATH = "/x02/abc/abcba2/";
chomp $LOGS_LOCAL_PATH;
my $LOGS_REM_PATH = "/x01/INT/abc/vabc2/";
chomp $LOGS_REM_PATH;
my $TODAY = `date +%Y%m%d`;
chomp $TODAY;
my @GETLOOP = @ARGV;
    unless ($#ARGV >= 0) {
        print "\nUsage: gtp_logs.pl <file1> <file2> <file3>.....<file(n)>\n\n";
        exit;
    }
        system("clear");
    unless ( -d "$LOGS_LOCAL_PATH"."$TODAY") {
        print "Directory \"$TODAY\" doesn't exist. So creating the directory..!\n";
        print "OK..Done.....!\n\n";
        system("mkdir $LOGS_LOCAL_PATH/$TODAY");
        }
    else {
        print "Directory already exists. Logs will be downloaded to ==>     \"$LOGS_LOCAL_PATH$TODAY\".....!\n\n";
    }
    
               # if_DOWNLOADED($LOGS_LOCAL_PATH,$TODAY,@GETLOOP);
    
    chdir("$LOGS_LOCAL_PATH"."$TODAY") || die "cannot cd to  ($!)";
    foreach my $GETL (@GETLOOP) {
    my $is_downloaded = if_DOWNLOADED($LOGS_LOCAL_PATH,$TODAY,$GETL);
    if(!$is_downloaded)
    {
        get_LOGS("172.25.70.221","abc","abc2","/x01/INT/abc",$GETL);
        print "File \"$GETL\" downloaded to ==>          \"$LOGS_LOCAL_PATH$TODAY\"\n\n";
    }
    else
    {
        print "File \"$GETL\" has already been Downloaded to ==>          \"$LOGS_LOCAL_PATH$TODAY\"\n\n";
    }
    
    
    }
    

 sub get_LOGS {
    my $LOG_HOST  = shift;
    my $REM_USER  = shift;
    my $REM_PASSW = shift;
    my $REM_PATH  = shift;
    my $REM_FILE  = shift;
    
        print "Connecting to the sftp share! Please wait....!\n";
        my $sftp = Net::SFTP::Foreign->new($LOG_HOST, user => $REM_USER, password => $REM_PASSW);
        $sftp->setcwd($REM_PATH) or die "unable to change cwd: " . $sftp->error;
        print "OK. On the share! Downloading the file \"$REM_FILE\"...................!\n\n\n\n";
        $sftp->error and die "Problem connecting to the share...!!!! " . $sftp->error;
        $sftp->get($REM_FILE) or die "File does not seem to be present on the remote share. Please re-request..!!!" . $sftp->error;
        return $REM_FILE;
}
   
sub if_DOWNLOADED {
    my $DWD_FILE_PATH = shift;
    my $DWD_DIR       = shift;
    my $DWD_FILE      = shift;
    if (-e "$DWD_FILE_PATH/$DWD_DIR/$DWD_FILE")
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

誰かがこの問題の解決策を見つけるのを手伝ってくれませんか? 同じスクリプトを使用して変更してみてください。

/V

4

1 に答える 1

3

あなたのコードへのいくつかのコメント:

  • 多くのエラーを早期にキャッチするために、strictとwarningsを使用してください。

  • スタイルに関する本を読んでください(つまり、Damian ConwayのPerlBestPractices)。ただし、いずれの場合も、変数、サブルーチン、およびすべてに名前を付けるときは、それらの場合と一貫性を保つようにしてください。

  • 複数の場所で計算値を使用する必要がある場合は、一度計算して変数に保存してみてください。

  • 些細なことにサブルーチンを使用しないでください。

  • 定義した変数を呼び出す必要はなく、最後に文字chompがありません。"\n"

  • ファイル転送ごとに新しいSFTP接続を開くことは、非常に非効率的です。最初に1つだけ開いて、すべての転送に使用できます。

そして今、あなたのスクリプトの簡略化されたバージョン:

#!/usr/bin/perl

use strict;
use warnings;

my $host = "172.25.70.221";
my $user = "abc";
my $password = "abc1234321";

my $LOGS_LOCAL_PATH = "/x02/ABC/abc2";
my $LOGS_REM_PATH = "/x01/INT/abc/vim";
my $TODAY = `date +%Y%m%d`;
chomp $TODAY;
my $TODAY_LOCAL_PATH = "$LOGS_LOCAL_PATH/$TODAY";

my @files = @ARGV;
@files or die "\nUsage: gtp_logs.pl <file1> <file2> <file3>.....<file(n)>\n\n";

system("clear");

if ( -d $TODAY_LOCAL_PATH) {
    print "Directory already exists. Logs will be downloaded to ==>     \"$TODAY_LOCAL_PATH\".....!\n\n";
}
else {
    print "Directory \"$TODAY\" doesn't exist. So creating the directory..!\n";
    mkdir "$TODAY_LOCAL_PATH" or die "unable to create directory: $!\n";
    print "OK..Done.....!\n\n";
}

chdir $TODAY_LOCAL_PATH or die "cannot cd to  ($!)\n";

my $sftp =  Net::SFTP::Foreign->new($host, user => $user, password => $password);
$sftp->error
    and die "Problem connecting to the share...!!!! " . $sftp->error;

my $ok = 0;
my $failed = 0;
foreach my $file (@files) {
    if (-e "$TODAY_LOCAL_PATH/$file") {
        print "File \"$file\" has already been Downloaded to ==>          \"$TODAY_LOCAL_PATH\"\n";
    }
    else {
        if ($sftp->get("$LOGS_REM_PATH/$file")) {
            print "File \"$file\" downloaded to ==>          \"$TODAY_LOCAL_PATH\"\n";
            $ok++;
        }
        else {
            print "Unable to download file \"$file\" : " . $sftp->error . "\n";
            $failed++;
        }
    }
}

print "$ok files have been downloaded, $failed files failed!\n\n";    
于 2013-03-21T09:16:30.250 に答える