Tipy a triky pro Příkazový řádek (Windows Console)

Windows NT obsahují Příkazový řádek (anglicky Windows Console), který je nástupcem MS-DOS (používaným před a ve Windows 9x). Příkazový řádek (též konzola nebo hovorově konzole) používá stejné příkazy jako jeho předchůdce, navíc ale obsahuje celou řadu rozšíření, které ne vždy všichni ovládají. Nástupce Příkazového řádku je Microsoft PowerShell, který podporuje původní příkazy MS-DOS, ale místo rozšíření Příkazového řádku používá vlastní funkce a syntaxy.

Stejně jako v MS-DOS bylo možno psát skripty do BATCH souborů (*.bat), v Příkazovém řádku je možno spouštět skripty ze souborů s příponou *.cmd (zkratka commands). Skript můžete spustit zadáním jeho jména v příkazovém řádku (uvedení přípony není nutné) nebo dvoj-klikem na jeho soubor v Průzkumníku (nejiném programu, např. Total Commanderu). Skript nejde připnout k Panelu úkolů. Pokud připnete běžící skript, připne se pouze Příkazový řádek a ne konkrétní skript. Pokud zkusíte skript zkopírovat do Pinned\TaskBar, budou ho Windows ignorovat.

Vkládání jmen souborů s mezerami

MS-DOS mezery ve jménech souborů nepodporoval, takže tento problém neexistovat. Ve Windows ale není problém pojmenovat soubor s mezerou. Aby šla tato jména uvádět do Příkazové řádky, můžete jméno, celou cestu, nebo její část uvést do dvojitých uvozovek (jiné uvozovky nefungují). Příklady platných jmen souborů a složek:

  • "C:\Program Files\Windows Photo Viewer"
  • "C:\Program Files"\"Windows Photo Viewer"
  • C:\"Program Files"\"Windows Photo Viewer"
  • "C:\Program Files"\WindowsPowerShell

Pozor na to, že při používání uvozovek uvnitř skriptu nebo při volání skriptu může mít různé účinky! Uvedení uvozovek u parametru může uvozovky předat do skriptu nebo dokonce způsobit chybu syntaxe (viz dále).

Když máte spuštění Příkazový řádek, můžete také přetáhnout soubor z Průzkumníka do konzole a ta automaticky vypíše jméno tohoto souboru. Pokud vyberete více souborů, vloží se jen jméno toho, který táhnete.

Automatické dokončování jmen souborů

Když píšete v Příkazovém řádku jméno souboru nebo složky, můžete stiskem klávesy TAB požádat řádek o automatické dokončení jména. Konzole doplní jméno prvního souboru nebo složky, jehož jméno odpovídá již zadanému textu. Dalšími stisky TAB můžete doplnit jméno dalších souborů nebo složek odpovídajících původnímu textu.

Příklad: pokud zadáte do konzole c:\pro a stisknete TAB, automaticky se dokončí "C:\Program Files" (včetně uvozovek). Další stisk TAB pak změní cestu na "C:\Program Files (x86)" (pouze na 64-bit Windows) nebo na C:\ProgramData.

Skrytí kódu a výpisu skriptu

Když spustíte skript, bude konzole vypisovat jednotlivé příkazy a jejich výstup. Pokud chcete skript spustit jako program, tedy aby nebylo vidět, z jakých příkazů se skrývá, zadejte na začátek souboru:

echo off

Tím vypnete výpis spuštěních příkazů a zobrazí se pouze výstup jednotlivých příkazů.

Pokud chcete skript debuggovat, můžete první příkaz změnit na echo on, nebo echo on uvést kamkoliv do skriptu a další příkazy se opět budou vypisovat. Pokud uvedete jen „echo“, vypíše se „echo off“ nebo „echo on“, podle toho, jaký je aktuální stav (hodí se pro debuggování při použití goto nebo call).

Vlastní text pak můžete vypsat příkazem echo a uvedením libovolného jiného textu (tedy cokoliv kromě „off“ a „on„). Prázdný řádek vypíšete zadáním echo. (tedy uvedením tečky bez mezery za echo).

Pokud chcete skrýt výstup konkrétního příkazu, můžete za něj uvést > NUL:

process > NULL

Toto se často používá v kombinaci příkazů echo a pause, kdy chcete místo výchozího textu „Stiskněte libovolnou klávesu pro pokračování“ zobrazit jiný text:

...
echo První část dokončena.
echo Stiskněte libovolnou klávesu pro spuštění druhé části.
pause > NUL
...

Pokud chcete místo výstup příkazu skrýt, ale nechcete o něj přijít, můžete ho nechat uložit do souboru:

process %1 > output.log
process %2 >> output.log
echo. >> output.log
echo Dokončeno >> output.log

Uvedená sekvence vytvoří nový soubor output.log (nebo přepíše existující) a následně do něj přidá výstup prvního a druhého příkazu. Na konec soubor pak přidá prázdný řádek a text „Dokončeno“.

Poznámka: existuje i opačný operátor, pomocí něhož můžete obsah souboru předat příkazu jako vstup. V tomto případě ale musí daný příkaz být schopen vstup zpracovat:

process %1 -value=%2 < input.txt

Parametry skriptu

Skriptu můžete předat parametry. Pokud spouštíte skript z příkazové řádky, stačí parametry zadat za jméno skriptu:

> script.cmd param1 param2 param3
> script param1 param2 params3

Normálně můžete předat skriptu až 9 parametrů. K nim se pak ve skriptu dostanete zadáním %1, %2, atd. až %9. Pokud chcete použít více parametrů, podívejte se dále na Cyklické zpracování parametrů.

Příklad:

echo Příprava %1 s hodnotou %2.
prepare %1 -value=%1
echo Ukládání do %3...
Process %1 -output=%3

Předání souborů skriptu

Skript můžete spustit s parametrem i z Průzkumníka (nebo Plochy; ale ne z jiných programů jako Total Commander) tím, že označíte soubory (v Průzkumníku nebo jiném programu, třeba Total Commander) a přetáhnete je na ikonu skriptu. Tímto způsobem ale můžete skriptu předat pouze seznam souborů a ne žádné další parametry.

Z příkazové řádky můžete soubory předat skriptu zadáním jmen za jméno skriptu:

> skript soubor1.txt "soubor 2.txt"

Tímto způsobem můžete ale předat jen omezené množství souborů, nicméně na početní omezení narazíte jen při přetažení velkého množství souborů (50 nebo více v závislosti na délce jejich jmen).

Při zadávání jmen do konzole s uvozovkami se jména souborů předají včetně uvozovek. Při přetažení z Průzkumníka se jména souborů předají bez uvozovek (ale se správně ošetřenými mezerami ve jménech). Na to je potřeba dávat pozor při dalším zpracování!

Získání parametru ve skriptu

Uvnitř skriptu můžete použít konkrétní skript zadáním %X, kde X je číslo 1 – 9. Tato základní syntaxe z MS-DOS je v Konzoly rozšířena o možnost získání jen části parametru, pokud jde o jméno souboru. Můžete tak například získat jen jméno, příponu nebo cestu k souboru a následně s nimi pracovat odděleně.

Díky tomu, že vložení parametru začíná znakem procent a končí jednou číslicí, není potřeba ho oddělovat od dalšího textu. Klidně tak můžete přidat příponu souboru jednoduše tím, že za číslo parametru zadáte tečku a příponu (viz příklad níže).

Ze jména souboru v parametru můžete získat následující části:

  • %~1 vrátí první parametr jak je, jen odstraní uvozovky
  • %~f1 vrátí plné jméno (fullname) souboru včetně cesty
  • %~n1 vrátí jen jméno souboru (name) bez cesty a přípony
  • %~x1 vrátí příponu souboru (s tečkou; např. „.txt„)
  • %~d1 vrátí písmeno disku, na kterém je soubor (např. C:)
  • %~p1 vrátí cestu k souboru v unix formátu (např. \path\)
  • %~dp1 vrátí cestu k souboru včetně disku (např. C:\path\)
  • %~nx1 vrátí jméno souboru s příponou (např. file.txt)
  • %~dpn1 vrátí celé jméno souboru vč. cesty, ale bez přípony (užitečné pro převod souboru).
  • přidání „s“ do filtru parametru převede všechna jména na DOS formát (8.3), např. %~sp1 vrátí cestu se složkami v 8.3 formátu, %~sx1 vrátí příponu zkrácenou na 3 písmena, apod.
  • %~a1 vrátí atributy souboru
  • %~t1 vrátí čas vytvoření souboru
  • %~z1 vrátí velikost souboru
  • %~ $PATH:1 zkusí najít soubor ve složkách uvedených v PATH a vrátí celé jméno vč- cesty pro první nalezený soubor.
rem Zpracování souboru s cestou:
process %1

rem Zpracování souboru, nejprve přepnutí do jeho složky:
cd %~dp1
process %nx1

rem Zpracování souboru a uložení s novou příponou
process -i %~1 -i %~dpn1.xml

Nultý parametr = jméno skriptu

Ve skriptu můžete použít i nultý parametr, ve kterém je uloženo jméno právě spuštěného skriptu.

Uložení hodnoty do proměnné

Ve skriptech (ale i mimo ně) můžete používat proměnné. Ty se vytvářejí příkazem set, za který zadáte jméno proměnné, rovnítko a hodnotu. Vytvořenou proměnnou pak můžete v příkazu použít tak, že uvedete jméno proměnné mezi uvozovky. Při vytvoření proměnné můžete použít předdefinovanou hodnotu (tzv. hard-coded) nebo hodnotu z parametru:

set process=cbr
set quality=%1
convert %process% -q %quality% %2

Pokud hodnotu nevytvoříte a zkusíte ji použít, nedojde k nahrazení a do příkazu se pošle přímo daný řetězec vč. znaků procent:

> echo Proměnná %tohle_neexistuje%.
Proměnná %tohle_neexistuje%.

Dejte pozor na to, že hodnota je do proměnné vložena přesně tak, jak je vložena do skriptu až po znak nové řádky. Nejčastější chyby tak jsou ty, že za hodnotu vložíte mezeru, která není vidět, ale uloží se do proměnné, nebo že hodnotu uvedete do uvozovek (nebo jsou uvozovky uvedeny v parametru skriptu) a následně vložíte proměnnou také do uvozovek:

rem špatně (neviditelné mezery za hodnotou):
set file=%1   
rem správně (odřádkování hned za hodnotou):
set file=%1

rem špatně (parametr může obsahovat uvozovky, takže budou zdvojené):
set file=%1
process "%file%"
rem špatně (ručně dodané uvozovky, budou zdvojené):
set file="%1"
process "%file%"
rem správně (jméno souboru bez uvozovek):
set file=%~1
process "%file%"
rem správně (očekáváme uvozovky v proměnné):
set file="%~1"
process %file%

Další častá chyba bývá, že jméno proměnné uvedete do znaků procent. V tomto případě se místo vytvoření proměnné pod daným jménem vytvoří proměnné pod hodnotou dříve uloženou v proměnné nebo se vytvoří proměnná včetně procent, pokud dosud neexistuje:

set a=1
set %a%=2
rem vytvoří proměnnou "a" s hodnotou "1" a proměnnou "1" s hodnotou "2"

set %b%=3
rem vytvoří proměnnou %b% s hodnotou 3

Pokud chcete udělat skript interaktivní, můžete se na hodnotu parametru zeptat uživatele. Stačí příkazu set přidat parametr /P (prompt) a za rovnítko místo hodnoty zadat text dotazu:

set process=cbr
set /P quality=V jaké kvalitě chcete provést převod souboru %2? [např. 128, 196, 320]: 

Poznámka: zde je naopak vhodné za text uvést mezeru, aby zobrazený dotaz nesplýval s hodnotou, kterou zadává uživatel.

Pokud chcete dotazu vytvořit výchozí hodnotu, stačí jí do proměnné uložit před dotazem. Uživateli pak stačí stisknout Enter a bude použita výchozí hodnota:

set process=cbr
set quality=320
set /P quality=Zvolte kvalitu převodu [výchozí: 320]: 
convert %process% -q %quality% %1

Práce s jmény souborů se speciálními znaky

Kromě mezery dělá Windows konsole problémy znak „&“, který slouží ke spojování příkazů:

rem V jediném řádku spustí process and vypíše dvě hlášky (před a po):
echo Start & call process.cmd & echo End

Pokud do skriptu chcete předat jméno souboru nebo URL obsahující znak &, je potřeba ho escapovat znakem stříšky, tedy ^& nebo uvést do uvozovek:

process.cmd c:\Documents^&Settings\file.txt
download.cmd http://server.com/download?name=file^&ext=txt

process.cmd "c:\Documents&Settings\file.txt"
download.cmd "http://server.com/download?name=file&ext=txt"

Pokud takový soubor přetáhnete na Batch skript, Windows přidají uvozovky automaticky:

echo off
rem Drag&Drop souboru s mezeramy nebo & ve jméně je automaticky ošetřeno:
process.exe %1

Pokud potřebujete ověřit, že byl parametr předán skriptu, můžete použít speciální kontrukci příkazu if s hranatými uvozovkami:

rem Selže pokud %1 obsahuje jméno souboru s uvozovkami:
if "" == "%1" goto end

rem Selže pokud skript zavoláte z konzole bez uvozovek:
if "" == %1 goto end

rem Funguje vždy správně; hranatá závorka se neduplikuje s uvozovkami:
if [] == [%1] goto end

Problém nastává v okamžiku, kdy chcete ověřit, že soubor existuje nebo z něj vyparsovat části jméno (příponu, složku, apod.). V tom případě je potřeba vždy zachovat uvozovky kolem hodnoty parametru nebo hodnoty proměnné:

rem Odstraní uvozovky, přidá příponu a opět uvozovky přidá:
set temp_filename="%~1.tmp"
process -in %1 -out %temp_filename%

rem Získání jména souboru a cesty (viz dále) včetně uvozovek:
set filename="%~nx1"
set filepath="%~p1"
rem Přepnutí pracovní složky na disk a složku souboru:
%~d1
cd %filepath%
rem Zpracování souboru v jeho složce:
c:\process.exe %filename%

rem Proměnné můžete skládat dohromady a Konzola správně pochopí, co chcete:
process -input %filename% -output %tmp%\%filename%.tmp

Jak je vidět, pokud části jména používáte pro vytvoření cesty a jména souboru, můžete používat hodnoty v uvozovkách a není problém s tím, že uvozovky jsou uloženy přímo v hodnotě proměnné. Jen je potřeba dát pozor, pokud chcete do jména přidat jméno se speciálními znaky, abyste správně použili uvozovky:

rem Tohle je špatně, protože vytvoří nevhodně zdvojené uvozovky:
process -input %filename% 
        -output "%filepath%temp folder & files\%filename%.tmp"

rem Tohle je správně (uvede v uvozovkách jen jméno složky):
process -input %filename% 
        -output %filepath%"temp folders & files\"%filename%.tmp

Pokud byste potřebovali získat jméno souboru bez uvozovek a uvést ho do příkazu v uvozovkách, můžete použít speciální konstrukci pro vložení proměnné s nahrazením znaku. To se provádí tak, že za jméno proměnné uvedete uvozovku, znak, který chcete odstranit a za rovnítko znak, který chcete vložit – jelikož ale chcete uvozovky odstranit a nic nevkládat, skončíme rovnítkem:

rem Získání jméno souboru
set filename="%~n1"
echo Processing %filename%…

rem Pomocí FFMPEG vloží do popisu první stopy jméno souboru bez uvozovek:
ffmpeg -i %1 -c copy -metadata:s:v:0 title="Ze souboru: %filename:"=%" %filename%.new.mkv

Poznámka: zápis uvozovek a procent v příkazu může některé „chytřejší“ editory zmást, ale je skutečně správně, že parametr title obsahuje 3 znaky uvozovek!

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..