Perl 创建目录并在其中保存adb日志

Perl 创建目录并在其中保存adb日志,perl,Perl,我正在尝试在当前目录中创建一个新目录,并在刚刚创建的新目录中保存adb日志。我正在尝试以下代码,但每次运行时都会覆盖日志。我希望保存所有日志,而不是覆盖它们 use POSIX; use Getopt::Long; our $timestamp; our $mainlog_filename; our $ostype = $^O; our $ProcessObj; $SIG{'INT'} = 'INT_handler'; $SIG{'TERM'} = 'INT_handler'; $SIG{'AB

我正在尝试在当前目录中创建一个新目录,并在刚刚创建的新目录中保存adb日志。我正在尝试以下代码,但每次运行时都会覆盖日志。我希望保存所有日志,而不是覆盖它们

use POSIX;
use Getopt::Long;
our $timestamp;
our $mainlog_filename;
our $ostype = $^O;
our $ProcessObj;
$SIG{'INT'} = 'INT_handler';
$SIG{'TERM'} = 'INT_handler';
$SIG{'ABRT'} = 'INT_handler';
$SIG{'QUIT'} = 'INT_handler';

if($^O eq 'MSWin32') { 
    $SIG{'BREAK'} = 'INT_handler';
    use Win32::Process;
}

$split_val = join(':', @ARGV[0..(@ARGV-1)]);

@split_val = split(':',$split_val);
$counter=1;
foreach $sno(@split_val)
{
print "Serial Number $counter is $sno\n";
$counter++;
}

# Hash to translate number to month name
my $monthhash = {
    1  => 'Jan',
    2  => 'Feb',
    3  => 'Mar',
    4  => 'Apr',
    5  => 'May',
    6  => 'Jun',
    7  => 'Jul',
    8  => 'Aug',
    9  => 'Sep',
    10 => 'Oct',
    11 => 'Nov',
    12 => 'Dec',
};


$currdir = `pwd`; 
chomp $currdir; # gets current directory
$currdir =~ s/ \/[^\/]+$//; # removes the last / and everything after it
$new_dir = "adb logs";
$perm = 755;


sub makeDir {
  if (-e "$new_dir"){ problem("Directory $new_dir already exists.\n") } # Checks for existing
  mkdir ($new_dir,$perm) || problem("Error making Directory $new_dir\n");
  print "Content-type: text/html\n\n";
  print "$new_dir Directory has been created.\n";
  }
sub main
{
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $mon  = $mon + 1;
    $mday = sprintf("%02d", $mday) if $mday <= 9;
    my $date    = $monthhash->{$mon}.$mday;
    $timestamp=$date."_".$hour."_".$min;
    foreach $sno(@split_val)
    {
    chomp($sno);
      $mainlog_filename = "adblogs_".$sno."_".$timestamp.".txt";
    }

    makeDir() unless -d $new_dir;

    my $adbcommand_logcat;
    my $adb_install_apk;
    my $adb_install_testapk;

    if($ostype eq 'MSWin32') {
        system("title Android");

        foreach $sno(@split_val)
        {
        chomp($sno);
        print "$sno\n";


        chdir $new_dir;
        $adbcommand_logcat = "start \"Android-Logcat\" cmd /c \"adb -s $sno logcat -v time | tee ".$mainlog_filename."\"";
        chdir $currdir;
        $adb_install_apk = "adb install xyz.apk";
        $adb_install_testapk = "adb install xyzTest.apk";

    $cmd = "adb -s $sno get\-state";
    my $cmdop = qx/$cmd 2>&1/;


    print $cmdop;


      if($cmdop =~ m/device/i) {

            system($adb_install_apk);
            system($adb_install_testapk); 
            system($adbcommand_logcat); 
        }
     else {
        print "Device is offline\n";
    }

    }
}
}
sub terminate
{
    print "\nTerminating script ...\n";
    system("adb kill-server");
   #if($ostype eq 'MSWin32') {
   #   $ProcessObj->Kill(0);
  #  }
    exit 0;
}

sub INT_handler
{
    terminate(); 
    exit 0;
}


main();
使用POSIX;
使用Getopt::Long;
我们的$timestamp;
我们的$mainlog\u文件名;
我们的$ostype=$^O;
我们的$ProcessObj;
$SIG{'INT'}='INT_handler';
$SIG{'TERM'}='INT_handler';
$SIG{'ABRT'}='INT_handler';
$SIG{'QUIT'}='INT_handler';
如果($^O eq'MSWin32'){
$SIG{'BREAK'}='INT_handler';
使用Win32::Process;
}
$split_val=join(“:”,@ARGV[0..(@ARGV-1)];
@split_val=split(“:”,$split_val);
$counter=1;
foreach$sno(@split_val)
{
打印“序列号$counter为$sno\n”;
$counter++;
}
#将数字转换为月份名称的哈希
我的$monthhash={
1=>1月,
2=>“二月”,
3=>“三月”,
4=>“四月”,
5=>“五月”,
6=>“六月”,
7=>“七月”,
8=>“八月”,
9=>“九月”,
10=>“十月”,
11=>11月,
12=>“十二月”,
};
$currdir=`pwd`;
大嚼$currdir;#获取当前目录
$currdir=~s/\/[^\/]+$/;#删除最后一个/和它之后的所有内容
$new_dir=“adb日志”;
$perm=755;
副马克迪尔{
if(-e“$new_dir”){问题(“目录$new_dir已经存在。\n”)}检查是否存在
mkdir($new_dir,$perm)|问题(“生成目录$new_dir\n时出错”);
打印“内容类型:text/html\n\n”;
打印“$new_dir目录已创建。\n”;
}
副总管
{
我的($sec、$min、$hour、$mday、$mon、$year、$wday、$yday、$isdst)=本地时间(time);
$mon=$mon+1;
$mday=sprintf(“%02d”,$mday),如果$mday{$mon}.$mday;
$timestamp=$date.。。。$hour.。。。$min;
foreach$sno(@split_val)
{
咀嚼($sno);
$mainlog_filename=“adblogs_uu”。$sno。”。。$timestamp..txt”;
}
makeDir()除非-d$new_dir;
我的$adbcommand_logcat;
我的$adb\u安装\u apk;
我的$adb\u安装\u测试PK;
if($ostype eq'MSWin32'){
系统(“名称”);
foreach$sno(@split_val)
{
咀嚼($sno);
打印“$sno\n”;
chdir$new_dir;
$adbcommand_logcat=“start\”Android logcat\“cmd/c\”adb-s$sno logcat-v time | tee.“$mainlog_filename.”;
chdir$currdir;
$adb\u install\u apk=“adb install xyz.apk”;
$adb\u install\u testapk=“adb install xyzTest.apk”;
$cmd=“adb-s$sno get \-state”;
我的$cmdop=qx/$cmd 2>&1/;
打印$cmdop;
如果($cmdop=~m/device/i){
系统($adb\u安装\u apk);
系统($adb\u安装\u测试PK);
系统($adbcommand_logcat);
}
否则{
打印“设备处于脱机状态\n”;
}
}
}
}
次级终止
{
打印“\n删除脚本…\n”;
系统(“adb杀死服务器”);
#if($ostype eq'MSWin32'){
#$ProcessObj->Kill(0);
#  }
出口0;
}
子整数处理器
{
终止();
出口0;
}
main();

非常感谢您的帮助。

此脚本中有太多的混乱

您没有使用严格的
;使用警告可帮助您检测和防止常见错误。尽快将其放在每个Perl脚本的顶部,并修复它发现的所有错误。如果添加
则使用诊断您可以获得每个错误消息的详细解释

您正在将全局变量与我们的
一起使用。很少有需要这样做的情况。更可能的情况是,您希望词法变量带有
my
。另外,在尽可能紧凑的范围内声明变量,并尽可能接近它们的第一次使用。预先声明变量不会增加可读性

即使
use
语句出现在
if
中,它也始终会执行。这些语句不受正常控制流的约束,因为它们是在编译时执行的。对于条件加载,请使用
if
pragma:
use if$^O eq“MSWin32”和“Win32::Process”
,尽管这种条件加载通常没有帮助

@ARGV[0..(@ARGV-1)]
@ARGV
基本相同。其他一切都是模糊的。(在返回值等中使用时存在差异,但这与此处无关)

如果
@ARGV
中没有包含冒号的元素,那么
@split\u val=split':',join':',@ARGV
是一种非常奇特的书写
@split\u val=@ARGV
的方式,即复制。如果元素可以包含冒号,那么
@split_val=map{split':'}@ARGV
可能更清晰

迭代数组元素和索引时,最好迭代索引并访问数组元素:

for my $i (1 .. @array) {
  print "The $i-th element has the value $array[$i-1]\n";
}
这比手动递增
$计数器
更清晰

你似乎在做自己的日期格式化。检查
POSIX
模块中的
strftime
功能。您似乎希望将日期格式化为
Jan28\u 19\u 45
。这可以通过以下方式实现:

 use POSIX qw/strftime/;

 my $timestamp = strftime '%b%d_%H_%m', localtime;
插入变量时,通常更容易读取,而不是使用
运算符连接字符串。例如,
“foo”。$bar。“baz”
可以变成
“foo$bar baz”
。要分隔变量名,可以使用大括号:
“foo”$bar。“baz”
“foo${bar}baz”
相同

我看不出您在哪里定义了
问题
函数。对于致命错误,请使用
die

分配给循环中的同一变量只保留最后一个值:

my $foo;
for my $i (1 .. 3) {
  $foo = $i;
}
# $foo == 3, so let's write my $foo = 3 directly!
除非命令使用shell操作符,如
|
,否则最好将列表传递给
系统
,而不是单个字符串。这避免了shell插值问题。例如

system "echo", "|delimited text|", "{m,e,t,a}characters";
系统执行一些错误处理。一种可能性是
使用autodie qw/:all/

$new\u dir=“adb日志”
–您永远不会指定不同的值,因此
mkdir
永远不会创建不同的目录。所有这些都是用
-e
-d进行间接寻址的