Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Titulní Blogy Fotky Soubory

Petr Lazecký

Chorobovýplody

Windows konzole podruhé

Tento článek by měl být volným pokračováním na téma “Konzola ve Windows”. Ne že bych si nějak zamiloval psaní BAT souborů v konzole. To rozhodně ne. Spíše je to o tom že pomocí konzolových příkazů lze rychle vyřešit některé základní úlohy. A také jsem nucet pracovat s kódem který byl napsán jinými. MS Office build systém je například kompletně postaven na BAT souborech a Perl skriptech.

Problém s konzolovými příkazy je ten že jsou velmi kompaktní a proto často i dost kryptické. Dokumentace Microsoftu není zrovna idealní takže rozluštit některé obraty byl pro mě osobně občas dost tvrdý oříšek. A s těmito obraty bych se tady s vámi rád podělil. Takže poďme do toho.

Magic příkazu SET

SET je velmi často používaný příkaz pro nastavování proměnných prostředí. Zde jsou ukázky některých skrytých tajů příkazu SET.

SET PATH=%PATH:v1.0.3705=v1.1.4322%

Kvíz z předchozího článku. Nahradí všechny výskyty řetězce v1.0.3705 řetězcem v1.1.4322.

SET SUBPATH=%PATH:~-15%

Vezme posledních 15 znaků z proměnné PATH a uloží je do proměnné SUBPATH.

SET SUBPATH=%PATH:~0, -1%

Proměnná SUBPATH bude nastavena tak že bude odříznut poslední znak z proměnné PATH. To se může například hodit při normalizaci cest kdy chcete mít jistotu že cesta neobsahuje jako poslední znak lomítko jako v tomto kódu:

SET POKUS=C:\Windows\TEMP\ 
IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1%
)
ECHO %POKUS%

Všimněte si umístění závorek u příkazu IF. První závorka musí být na stejném řádku jako příkaz IF protože jinak je závorka interpretována jako samostatný příkaz. To zní možná logicky ale dost dlouho mi trvalo než jsem přišel na to, že to musí být právě tak a ne jinak. Jinak řečeno, tento kód:

IF "%POKUS:~-1%" == "\" 
(
   SET POKUS=%POKUS:~0,-1%
)

je špatně. Uzavírací závorka může být na stejném řádku jako příkaz a nebo na samostatném řádku. Právě z toho pramenilo mé počáteční tápání. Takže:

IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1% )

je správně a stejně tak:

IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1%
)

je správně. Příkaz IF podporuje také klauzuli ELSE. V tomto případě musíte závorky použít takto:

IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1%
) ELSE (
   ECHO Else vetev
)

Tohle je špatně:

IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1%
)
ELSE
(
   ECHO Else vetev
)

A tohle je taky špatně:

IF "%POKUS:~-1%" == "\" (
   SET POKUS=%POKUS:~0,-1%
)
ELSE (
   ECHO Else vetev
)

ELSE musí být na stejném řádku jako jak uzavírací závorka bloku IF tak otevírací závorka bloku ELSE. Jsem zvědav kde se tohle dočtete :-).

Ale zpět k příkazu SET.

SET SUBPATH=%PATH:10, 5%

Vezme pět znaků z proměnné PATH. Počáteční znak začíná na desáté pozici proměnné PATH. V podstatě Mid() z Visual Basicu.

Příkaz SET funguje i jako jakási elementární kalkulačka. Pomocí přepínače /A dojde k vyhodnocení výrazu na pravé straně příkazu SET. Například:

SET /A 18*56

Vytiskne na konzolu 1008. Tímto způsobem je samozřejmě možné nastavit i jednotlivé proměnné prostředí. Více praktický příklad je tento kód:

SET _TOTAL=0
FOR /F "usebackq delims=" %%i IN (`DIR /B`) DO (
   SET /A _TOTAL=_TOTAL + %%~zi
)
ECHO %_TOTAL%

Tento kód postupně sečte velikosti všech souborů v aktuálním adresáři a na závěr vytiskne celkový součet. %%~zi je kryptická zkratka pro velikost souboru, viz níže.

SET /P lze použít pro vstup parametrů od užívatele. Například:

SET –P INPUT=Zadej string

Vytiskne na konzolu “Zadej string”. Poté co užívatel zadá vstupní hodnotu je tato hodnota přířazena do proměnné INPUT ze kterou lze pak dále pracovat.

V dokumentaci k příkazu SET jsou uvedeny některé implicitní promměné nastavené konzolou. Například proměnná %RANDOM% generuje náhodná čísla od 0 do 32767. To se může hodit při vytváření jmen dočasných souborů.

Další zajímavou proměnnou je %0. V BAT souborech se běžně používají proměnné %1, %2, atd. jako zástupné proměnné pro parametry na příkazové řádce. To je běžně známá věc a proto se tím tady nebudu zabývat. %0 obsahuje plnou cestu k aktualnímu BAT souboru. To je nesmírně užitečná informace protože dost často potřebujete v BAT souboru zjistit z jakého adresáře je BAT soubor spuštěn abyste mohli najít další potřebné soubory (častý případ je když spouštíte BATku ze síťového disku).

Zástupný příkaz “%” (bez uvozovek) – lepší jméno pro něj nemám – podporuje několik zajímavých přepínačů. Zpusťte si tuto BATku a uvidíte sami (zkopírujte BATku do trošku vnořenějšího adresáře aby byl vysledek více zřejmý):

:: Aktualni prikaz
ECHO %0
:: Plna cesta k BATce
ECHO %~f0
:: Pouze disk
ECHO %~d0
:: Pouze cesta
ECHO %~p0
:: Pouze jmeno souboru 
ECHO %~n0
:: Pouze extenze souboru 
ECHO %~x0
:: Short name souboru (plan cesta)
ECHO %~s0
:: Attributy souboru
ECHO %~a0
:: datum posledni modifikace
ECHO %~t0
:: velikost souboru
ECHO %~z0

Tolik tedy k příkazu SET.

Malý komentář ke komentáři

Je známo že komentáře jsou BAT v souborech podporovány pomocí příkazu REM:

REM Vse od tohoto mista az do konce radku je ignorovano

Ja místo REM používám tzv. „label obuse“. V BATce začíná label (destinace pro příkaz GOTO) znakem ':'. Interpret konzole tento label nijak nevyhodnocuje takže řádek začínající ':' funguje vlastně stějně jako komentář. Toto zvěrstvo je možné vidět v BAT souborech poměrně často. Proč jsem si ho zvolil já? Nu, pro napsání příkazu REM jsou třeba tři znaky a pro :: jenom dva :-). Navic komentář pomocí :: působí jaksi přirozeněji, ale to je otazka vkusu.

V příštím pokračování bych popsal příkaz FOR a pak bych ukončil toto povídání několika praktickými ukázkami jako například parsování vstupních parametrů, psaní vlastních procedur čí volání Perl skriptu jako nativní BAT soubor.

Snad vám bude konzola více k užitku.

Zveřejněno Thursday, August 26, 2004 9:31 AM by lazo
Vedeno pod:

Upozornění na nové komentáře

Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde

Odebírat komentáře k tomuto příspěvku pomocí RSS

Komentář

 

Michal napsal:

hezke triky. Cast je k dispozici uz od windows 2000, opravdu skoda, ze se o tom moc nevi....
August 26, 2004 5:06 PM
 

angel333 napsal:

Tam, kde popisuješ SET /P máš jednou SET /P a podruhý SET -P, trochu mě to zmátlo. Jinak ale užitečnej článek.

June 3, 2007 3:01 PM
 

Deep end » Blog Archive » About Batch file napsal:

January 14, 2009 5:22 PM

Vytvoření nového komentáře

(povinný) 
(nepovinný)
(povinný) 
Opiš čísla, která vidíš na obrázku:
Odeslat
Powered by Community Server (Personal Edition), by Telligent Systems