2011-12-06 25 views
0

我有這個ini文件。如何使用Perl正則表達式解析ini文件或反正?

day=Mon 
time=01:00:00 
occurence=weekly 
taskname=monitorschedule 
taskrun=C:\monitor.bat 

我想這樣的輸出用於在Windows XP中創建新的計劃作業。

schtasks.exe /create /tr c:\monitor.bat /sc weekly /d Mon /st 01:00:00 /tn monitorschedule /ru "system" 

我已經試過這樣的事情:

my $file = 'C:\strawberry\perltest\ini file\MonitorSchedule.ini'; 
my $d; 
my $t; 
my $o; 
    my $n; 
    my $r; 
    my $u = '"system"'; 

    open (TEST, "<", $file) or die $!; # open ini file 
    while(<TEST>) # read all lines of the ini file 
    { 
    if($_ =~ m/day/) 
    { 
    my $day = $_; 
    my @days = split('=', $day); 
    $d = $days[1]; 
    } 
    if($_ =~ m/time/) 
    { 
    my $time = $_; 
    my @times = split('=', $time); 
    $t = $times[1]; 
    } 
    if($_ =~ m/occurence/) 
    { 
    my $occurrence = $_; 
    my @occurrences = split('=', $occurrence); 
    $o = $occurrences[1]; 
    } 
    if($_ =~ m/taskname/) 
    { 
    my $taskname = $_; 
    my @tasknames = split('=', $taskname); 
    $n = $tasknames[1]; 
    } 
    if($_ =~ m/taskrun/) 
    { 
    my $taskrun = $_; 
    my @taskruns = split('=', $taskrun); 
    $r = $taskruns[1]; 
     } 
    } 
    close TEST; 

print "schtasks.exe /create /tr $r /sc $o /d $d /st $t /tn $n /ru $u"; 

不幸的是,輸出不是我想要的。

schtasks.exe /create /tr C:\monitor.bat /ru "system". 

我不知道什麼是錯的。我錯在哪裏?

+2

-1。你顯然沒有運行你粘貼的程序,因爲程序打印了一些包含'/ tn'的文件,而你顯示的輸出沒有。由於證據與故事不符,這不是一個好問題。請修改它。 –

+0

@RobKennedy no sir,該程序不打印/ tn,是的,我想打印那一個,但這是我的問題。 – quinekxi

+0

我認爲這裏使用正則表達式並不好。即使有可能,它也是不必要的複雜,你會遇到這樣的問題。 – Dalmas

回答

4

爲了使代碼更乾淨,只是有一個「翻譯」哈希:

use strict; 
use warnings; 

my $translation = { 
    "day" => "d", 
    "time" => "st", 
    "taskname" => "tn", 
    "taskrun" => "tr", 
    "occurence" => "sc" 
}; 

my $command = "schtasks.exe /create "; 
while (<DATA>) { 
    chomp $_; 
    my ($key, $value) = split(/=/); 
    $command .= "/$translation->{$key} $value "; 
} 
$command .= "/ru \"system\""; 

__DATA__ 
day=Mon 
time=01:00:00 
occurence=weekly 
taskname=monitorschedule 
taskrun=C:\monitor.bat 
+0

要試試這個。看起來好極了。 – quinekxi

8

建議爲什麼要重新發明輪子?有一個完全可以接受的INI file reader in CPAN

> cat monsch.pl 
#!/usr/bin/env perl -w 

use strict; 
use Config::INI::Reader; 

my $filename = "/path/to/MonitorSchedule.ini"; 

my $ini = Config::INI::Reader->read_file($filename); 
my $global_section = $ini->{'_'}; 

printf "schtasks.exe /create /tr %s /sc %s /d %s /st %s /tn %s /ru \"system\"\n" 
    , $global_section->{'taskrun'} 
    , $global_section->{'occurence'} 
    , $global_section->{'day'} 
    , $global_section->{'time'} 
    , $global_section->{'taskname'} 
    ; 
> ./monsch.pl 
schtasks.exe /create /tr C:\monitor.bat /sc weekly /d Mon /st 01:00:00 /tn monitorschedule /ru "system"