główna strona  Język
poleceń
DOS
 
DOS, dziś mało kto o nim pamięta. Dawniej mieliśmy tylko tyle. Czarny ekran i migający u dołu kursor, czekający na polecenie tekstowe. Bez znajomości tych poleceń nie dało się korzystać z komputera PC. Ambicją każdego guru było nie tylko znać je biegle, ale umieć takie sztuczki, które zapierają innym dech w piersiach. Kto posiadł tę wiedzę, dziś tego nie żałuje, bo większość trików wciąż działa w Windows.
dla wygody
  • Załóżmy katalog C:\BATCH, w którym będziemy umieszczać pliki z poleceniami DOS
  • Dopiszmy go do listy katalogów Path, najlepiej z przodu, oddzielając od pozostałych znakiem średnika (dla słabiej zorientowanych: Start Uruchom system.cpl Zaawansowane Zmienne środowiskowe Zmienne systemowe Path Edytuj)
  • W utworzonym katalogu przygotujmy plik TEST.BAT o następującej treści:
@pause
  • Na pulpicie stwórzmy skrót do tego pliku (słabiej zorientowani mogą przeciągnąć ikonę pliku na pulpit używając prawego przycisku i z menu kontekstowego wybrać Utwórz skróty tutaj)
 
Tym sposobem uzyskamy ikonkę, której dwukliknięcie spowoduje wykonanie poleceń zawartych w naszym pliku. W tym przypadku powinno się pokazać czarne okienko z prośbą o naciśnięcie klawisza, a po naciśnięciu zniknąć. Nazwę i obraz ikonki możemy oczywiście dowolnie zmienić. W analogiczny sposób można postąpić z pozostałymi przykładami.
sztuczka typu 2w1
Typowa sytuacja, gdy chcemy zrobić coś dla każdego pliku w folderze. Na przykład spisać ich sumy MD5. Na pierwszy rzut oka potrzebne są dwa skrypty. Jeden, który zainicjuje wynikowy raport, a następnie przetworzy listę plików i dla każdego z nich wywoła drugi skrypt, wykonujący konkretną operację. Po namyśle znajdujemy sposób, jak oba skrypty zamknąć w jednym pliku MD5.BAT:
@echo off
if "%1"=="" goto all
C:\PROGRA~1\vmd5\vmd5.exe %1 %2
goto xit
:all
echo Czekaj cierpliwie, trwa zapisywanie sum MD5 . . .
if exist md5sum.txt del md5sum.txt
for %%f in (*.*) do call "%0" "%%f" "-omd5sum.txt"
:xit
Trik polega na spostrzeżeniu, że pomocniczy skrypt wywoływany jest z parametrami, a główny bez. Dlatego na samym początku następuje sprawdzenie parametru i jeżeli go brak, wykonywana jest część po etykiecie :all. Tam, w pętli for, polecenie call "%0" powoduje wywołanie tego samego skryptu, tym razem z parametrami, więc wykonana zostanie pierwsza jego część.
sztuczka z datą
Tworzymy codziennie kopię bezpieczeństwa. Jak sprawić, aby za każdym razem zapisywany plik miał inną nazwę, najlepiej zależną od aktualnej daty? Problem ten rozwiązuje skrypt daytrick.bat:
@echo off
:------ start datownika ------
if not 1%1==1 goto datuj
ver|date|find "Bieżąca">Radosna.bat
echo %0 %%2>Bieżąca.bat
call Radosna
for %%f in (Radosna Bieżąca) do del %%f.bat
goto done
:----- koniec datownika ------
:datuj
:-----------------------------
: w nazwie zapisywanego pliku
: zastosuj parametr nr 1
:-----------------------------
echo przykładowe dane>%1.txt
:done
Przedostatnią linijkę należy zastąpić własnymi poleceniami, zależnymi od potrzeb. Każde użycie %1 zostanie w nich zastąpione aktualną datą.  
Jak to działa? Trik 2w1 już znamy. Ten skrypt rozbija się na 2 części: jedna wykonywana przy zwykłym wywołaniu i druga - gdy dostarczono parametr. W pierwszym kroku tworzone są 2 pomocnicze skrypty:
Radosna.bat zawiera wynik polecenia date. Ponieważ to polecenie wymaga interwencji użytkownika, symulujemy tę interwencję przy pomocy polecenia ver. Dodatkowo wynik zostaje okrojony filtrem find, ponieważ potrzebna jest tylko jedna linijka. Otrzymamy plik z czymś w rodzaju:
Bieżąca data: 2010-03-21
Ktoś powie: cóż w tym niezwykłego? Każdy to zna. Ale gdy spojrzymy na tę linijkę bystrym okiem programisty, zauważymy, że wygląda ona jak polecenie o nazwie Bieżąca i dwóch parametrach: data: i 2010-03-21. Drugi skrypt tymczasowy, Bieżąca.bat dba właśnie o to aby nie zabrakło takiego polecenia. Będzie on zawierał powtórne wywołanie głównego skryptu, tym razem ze stosownym parametrem:
C:\BATCH\daytrick.bat %2
Wywołanie skryptu Radosna spowoduje przekazanie daty do skryptu Bieżąca, który wywoła główny skrypt, przekazując mu datę, aby wykonać zadanie. Na koniec polecenie for sprząta zbędne już skrypty pomocnicze.
UWAGA: Nowe Windowsy straciły zdolność wykonywania tej sztuczki z powodu tragicznego błędu w interpretacji polskich znaków.
sztuczka z Perl-em
Jako miłośnik Perl-a często piszę skrypty w tym języku. Problem w tym, że taki skrypt w systemie Windows nie ma właściwości pliku wykonywalnego, co w niektórych sytuacjach bardzo przeszkadza. Można temu zaradzić, przekształcając program Perl-owy w regularny plik poleceń DOS. Oto skrypt batify.bat, który to robi:
@rem = '
@echo off
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
exit
@rem ';
#!/usr/bin/perl
# konwersja pliku źródłowego Perl-a do języka poleceń DOS
my $fn = $ARGV[0] or die "Brak pliku źródłowego"; my @bat;
open(PE, $fn) or die "Nie można odczytać pliku $fn";
open(BA, '>', "$fn.bat") or die "Nie można utworzyć pliku $fn.bat";
open(ME, $0) or die "Nie mogę odczytać własnej treści";
while (<ME>) { last if /^#/; print BA $_; } close(ME);
while (<PE>) { print BA $_; } close(BA);
Rzecz jest bardzo prosta: trzeba skrypt Perl-owy poprzedzić kilkoma linijkami poleceń DOS, tak samo jak jest to zrobione powyżej. Są to linijki od pierwszego do drugiego polecenia @rem. W ten sposób otrzymaliśmy skrypt, który jest poprawny zarówno dla Perl-a jak i dla DOS-a.
DOS widzi tylko początkową część. @rem oznacza wiersz komentarza i jest ignorowany. perl ... wywołuje interpreter języka Perl w stosunku to tego samego pliku. pause czeka na przeczytanie wyników, a exit kończy wykonanie skryptu (i pomija całą resztę).
Perl rozumie @rem = jako definicję tablicy i przypisuje jej pierwszemu elementowi tekst ujęty w apostrofy, rozciągający się na kilka linijek. Ta tablica nie jest wykorzystywana do niczego poza zmyleniem DOS-a.
Właściwy program w Perl-u rozpoczyna się od wierszy z '#'. Scala on własny początek z plikiem określonym poprzez parametr.
 
opiekun: Janusz Wiśniewski :: rejestracja odwiedzin 4042 gości
mobi