我正在尝试在我当前的目录中创建一个新的目录,并将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();任何帮助都是非常感谢的。
发布于 2013-09-26 05:01:27
这个脚本中有太多的混乱。
您没有使用use strict; use warnings;,这可以帮助您检测和防止常见错误。尽快将其放在每个Perl脚本的顶部,并修复它发现的所有错误。如果你添加了use diagnostics;,你会得到每条错误消息更长的解释。
您在our中使用了全局变量。很少有需要这样做的情况。更有可能的是,您需要使用my的词法变量。此外,在尽可能严格的作用域中声明变量,并尽可能接近首次使用它们。提前声明变量并不能提高可读性。
即使use语句看起来位于if内部,它也始终会被执行。这些语句不受正常控制流的约束,因为它们是在编译时执行的。对于条件加载,使用if杂注:use if $^O eq "MSWin32", 'Win32::Process',尽管这种条件加载通常没有帮助。
@ARGV[0..(@ARGV-1)]基本上和@ARGV是一回事。其他的都是迷惑的。(在返回值等中使用时会有所不同,但这里不相关)。
如果@ARGV中的任何元素都不包含冒号,那么@split_val = split ':', join ':', @ARGV是编写@split_val = @ARGV的一种非常奇特的方式,即执行复制。如果元素可以包含冒号,那么@split_val = map { split ':' } @ARGV可能会更清晰。
当迭代数组元素和索引时,最好迭代索引,并访问数组元素:
for my $i (1 .. @array) {
print "The $i-th element has the value $array[$i-1]\n";
}这比手动递增$counter更清楚。
您似乎正在进行自己的日期格式设置。查看POSIX模块中的strftime函数。看起来你想像Jan28_19_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"相同。
我看不出您在哪里定义了problem函数。对于致命错误,请使用die。
为循环中的同一变量赋值仅保留最后一个值:
my $foo;
for my $i (1 .. 3) {
$foo = $i;
}
# $foo == 3, so let's write my $foo = 3 directly!除非您的命令使用|或>等外壳操作符,否则最好将列表传递给system,而不是传递单个字符串。这避免了壳插值问题。例如。
system "echo", "|delimited text|", "{m,e,t,a}characters";为system做一些错误处理。一种可能是use autodie qw/:all/。
$new_dir = "adb logs"; -您从不分配不同的值,因此mkdir永远不会创建不同的目录。所有这些使用-e和-d的间接性都令人困惑。
如果你在Windows上,你只需要做实际的工作。删除所有这些if ($ostype eq 'MSWin32'),如果您的脚本在另一个OS:BEGIN { $^O eq 'MSWin32' or die "This script can only be run on Windows" }上无用,则可以退出。
现在去解决这些问题,适当地缩进你的代码,使你的脚本可调试,如果之后你仍然有问题就回来。如果您正在寻找一个好的Perl教程,请查看Perl tagwiki中的列表。
https://stackoverflow.com/questions/19014527
复制相似问题