5. říjen 2020 Autor: Tibor
Vypíše, nastaví nebo odstraní systémové proměnné programu CMD.EXE. SET [proměnná=[řetězec]] proměnná Určuje název systémové proměnné. řetězec Určuje řetězec znaků, který bude přiřazen proměnné. Příkaz SET bez parametrů vypíše aktuální nastavení systémových proměnných. Jsou-li povolena rozšíření příkazů, příkaz SET se změní takto: Příkaz SET vyvolaný pouze s názvem proměnné, bez rovnítka a hodnoty zobrazí hodnoty všech proměnných, jejichž název začíná názvem uvedeným v příkazu SET. Příklad: Příkaz SET P zobrazí všechny proměnné začínající písmenem P. Není-li název proměnné v aktuálním prostředí nalezen, nastaví příkaz SET proměnnou ERRORLEVEL na hodnotu 1. Příkaz SET neumožňuje, aby rovnítko bylo součástí názvu proměnné. K příkazu SET byly přidány dva nové přepínače: SET /A výraz SET /P proměnná=[řetězec_dotazu] Přepínač /A udává, že řetězec vpravo od rovnítka je číselným výrazem, který bude vypočítán. Vyhodnocování výrazů je velmi jednoduché - podporuje následující operace (seřazené od nejvyšší priority k nejnižší): () - seskupování ! ~ - - unární operátory * / % - aritmetické operátory + - - aritmetické operátory <<>> - logické posunutí & - operace AND mezi bity ^ - operace EXCLUSIVE OR mezi bity | - operace OR mezi bity = *= /= %= += -= - přiřazení &&= ^= |= <<= >>= , - oddělovač výrazů Použijete-li některý z logických nebo modulových operátorů, uzavřete řetězec výrazu do jednoduchých uvozovek. Všechny nenumerické řetězce ve výrazu budou považovány za názvy proměnných prostředí a před jejich použitím budou jejich hodnoty převedeny na čísla. Je-li uveden název proměnné prostředí, která nebyla v aktuálním prostředí definována, bude použita hodnota nula. To umožňuje provádět aritmetické operace s hodnotami proměnných prostředí bez nutnosti zápisu znaků %. Je-li příkaz SET /A spuštěn z příkazového řádku mimo příkazový skript, zobrazí konečnou hodnotu výrazu. Operátor přiřazení vyžaduje, aby vlevo od něj byl uveden název proměnné prostředí. Číselné hodnoty jsou desítková čísla, pokud nezačínají hodnotou 0x (šestnáctková čísla), nebo hodnotou 0 (osmičková čísla). Proto 0x12 znamená stejnou číselnou hodnotu jako 18 nebo jako 022. Uvědomte si, že osmičkový zápis může být matoucí: 08 a 09 nejsou platná čísla, protože 8 a 9 nejsou platné číslice osmičkové soustavy. Přepínač /P umožňuje nastavit hodnotu proměnné na vstupní řádek zadaný uživatelem. Příkaz zobrazí řetězec promptString před čtením vstupního řádku. Řetězec promptString může být prázdný. Náhrada systémových proměnných byla změněna: %PATH:str1=str2% Příkaz rozvine systémovou proměnnou PATH a nahradí každý výskyt řetězce str1 v rozvinutém výsledku řetězcem str2. Pokud je řetězec str2 prázdný, bude odstraněn jakýkoli výskyt řetězce str1 ve výsledku. Pokud řetězec str1 začíná hvězdičkou, je nahrazen výstupní řetězec od počátku do prvního výskytu zbytku řetězce str1. Také je možno zadat podřetězec pro rozvinutí: %PATH:~10,5% Příkaz rozvine systémovou proměnnou PATH a použije pouze 5 znaků počínaje znakem jedenáctým (10 znaků posunuto) rozvinutého výsledku. Pokud délka není zadána, je použita délka zbývajícího řetězce. Pokud je posunutí nebo délka záporná, je použita hodnota vypočítaná jako součet délky řetězce systémové proměnné a zadaného posunutí nebo délky. %PATH:~-10% Výsledkem je posledních 10 znaků proměnné PATH. %PATH:~0,-2% Výsledkem jsou všechny znaky proměnné PATH s výjimkou posledních dvou. Dále byla přidána podpora zpožděného rozvinutí systémových proměnných. Tato podpora je ve výchozím nastavení vždy vypnuta, může však být povolena nebo zakázána pomocí přepínače příkazového řádku /V při spouštění programu CMD.EXE. Zkuste zadat příkaz CMD /? Zpožděné rozvinutí systémových proměnných je užitečné, je-li potřeba se vyhnout omezením aktuálního rozvinutí, které nastává, když je řádek textu čten, nikoli při jeho provádění. Následující příklad demonstruje problém s okamžitým rozvojem proměnné: set PROM=před if "%PROM%" == "před" ( set PROM=po if "%PROM%" == "po" @echo Vidíte-li tento text, fungovalo to ) Zde se zpráva nikdy nezobrazí, protože proměnná %PROM% v OBOU příkazech IF je nahrazena při čtení prvního příkazu If, protože tento příkaz logicky zahrnuje tělo složeného příkazu If. V příkazu If uvnitř složeného příkazu se ve skutečnosti porovnává hodnota "před" s hodnotou "po", a tyto hodnoty jsou různé. Podobně ani následující příklad nebude fungovat, jak bychom mohli očekávat: set SEZNAM= for %i in (*) do set SEZNAM=%SEZNAM% %i echo %SEZNAM% V tomto příkladu NEVZNIKNE seznam souborů v aktuálním adresáři, místo toho bude proměnná SEZNAM nastavena na poslední nalezený název souboru. Je to opět proto, že proměnná %SEZNAM% je rozvinuta pouze jednou, při čtení příkazu FOR, a v té době je proměnná SEZNAM prázdná. Ve skutečnosti tedy probíhá tato smyčka FOR: for %i in (*) do set SEZNAM= %i - tím je proměnná SEZNAM neustále nastavována na název posledního nalezeného souboru. Při zpožděném rozvinutí systémových proměnných se k rozvinutí systémových proměnných v době provádění příkazu používá jiný znak (vykřičník). Je-li zpožděné rozvinutí proměnných povoleno, mohly by uvedené příklady být přepsány tak, aby fungovaly správně: set PROM=před if "%PROM%" == "před" ( set PROM=po if "!PROM!" == "po" @echo Vidíte-li tento text, fungovalo to ) set SEZNAM= for %i in (*) do set SEZNAM=!SEZNAM! %i echo %SEZNAM% Jsou-li povolena rozšíření příkazů, existuje několik dynamických systémových proměnných, které lze rozvinout, nelze je však zobrazit pomocí příkazu SET. Hodnoty těchto proměnných jsou vypočítávány dynamicky při každém požadavku proměnnou rozvinout. Jestliže uživatel nadefinuje vlastní proměnnou se shodným názvem, uživatelská definice přepíše dynamickou proměnnou. Tyto dynamické proměnné jsou: %CD% - rozvine se na řetězec aktuálního adresáře %DATE% - rozvine se na aktuální datum ve stejném formátu jako používá příkaz DATE %TIME% - rozvine se na aktuální čas ve stejném formátu jako používá příkaz TIME %RANDOM% - rozvine se na náhodné desítkové číslo z intervalu 0 až 32767 %ERRORLEVEL% - rozvine se na aktuální hodnotu proměnné ERRORLEVEL %CMDEXTVERSION% - rozvine se na aktuální číslo verze funkcí rozšíření příkazů %CMDCMDLINE% - rozvine se na původní příkazový řádek, který vyvolal procesor příkazů.