Skryptowanie Windowsa: Perl
• tech • 362 słowa • 2 minuty czytania
Ta notatka została oznaczona jako wymagająca dopracowania: mal-repo-code.
Zawartość wpisu może ulec zmianie, zatem zapraszam do ponownych odwiedzin w niedalekiej przyszłości :)
Ostatnio musiałem popracować nad dyplomówką, przez co kolejny wpis o skryptowaniu windowsa się gdzieś zapodział i jego pojawienie się trochę opóźniło. Tym razem o pisaniu skryptów w moim ulubionym języku, czyli Perlu.
W ostatniej notce poświęconej WSH wspominałem, że można bez problemu “podłączyć” dowolny silnik i korzystać z dowolnego języka do pisania swoich skryptów jak Perl, Python, Lips, czy cokolwiek innego.
W przypadku naszego Perla sprawa wygląda o tyle prościej, że wystarczy skorzystać z modułu Win32::OLE i cieszyć się możliwościami jakie daje ta technika. To nie wszystko, bo zasoby CPAN zawierają bardzo dużo modułów przeznaczonych dla systemu Windows. Większość przydatnych nam modułów oznaczona jest prefiksem Win32, ale sama biblioteka modułów dla Windowsa zawiera ich o wiele, wiele więcej.
Perlowy odpowiednik mojego skryptu uptime zapisanego ostatnio w VBScript mógłby wyglądać tak:
use strict;
use Win32::OLE qw(in);
use Win32::OLE::Variant;
use Time::Local;
my $strComputer = '.';
my $objWMIService = Win32::OLE->GetObject('winmgmts:\\\\' . $strComputer . '\\root\\cimv2');
foreach my $objOS (in $objWMIService->InstancesOf('Win32_OperatingSystem')) {
my $objSWbemDateTime = Win32::OLE->new('WbemScripting.SWbemDateTime');
$objSWbemDateTime->{Value} = $objOS->LastBootUpTime;
my $bootTime = timelocal($objSWbemDateTime->Seconds, $objSWbemDateTime->Minutes,
$objSWbemDateTime->Hours, $objSWbemDateTime->Day,
$objSWbemDateTime->Month - 1, $objSWbemDateTime->Year);
my $nowTime = timelocal((localtime)[0..5]);
my $difference = $nowTime - $bootTime;
my ($seconds, $minutes, $hours, $days);
$seconds = $difference % 60;
$difference = ($difference - $seconds) / 60;
$minutes = $difference % 60;
$difference = ($difference - $minutes) / 60;
$hours = $difference % 24;
$difference = ($difference - $hours) / 24;
$days = $difference;
my $strUptime = "$hours:$minutes:$seconds";
if ($days == 1) { $strUptime = "$days day, $strUptime"; }
elsif ($days > 0) { $strUptime = "$days days, $strUptime"; }
print 'Uptime: ' . $strUptime;
}
Ogólna budowa i sposób korzystania z WSH i WMI jest bardzo podobne. Kod jest prosty, ale komentarza może wymagać odjecie 1 od miesiąca, w którym uruchomiono system. Funkcja localtime zwraca numer miesiąca w przedziale 0-11, więc aby zachować odpowiednią różnicę, najprościej wykonać właśnie to działanie.
Jak widać, dzięki Win32::OLE w bardzo łatwo można tworzyć skrypty i narzędzia korzystające z możliwości WSH i technologii OLE. A jeśli to nie wystarcza, można skorzystać z wielu innych modułów perlowych do zabaw z Windowsem.
A co sam Microsoft myśli o Perlu? Przeczytaj sam w artykule Perl of Wisdom.
Bardzo zachęcam do zabaw z Perlem ;)
Komentarze (0)