Příkazové rozhraní, ať už jde o Windows Command Prompt nebo PowerShell, využívá mezery pro oddělování příkazů a argumentů. Problém nastává, když názvy souborů či adresářů obsahují mezery. V takových situacích je nutné cesty k těmto souborům „escapovat“, tedy ošetřit tak, aby je interpret příkazů správně rozpoznal.
Proč je „escapování“ mezer v příkazovém řádku nutné?
Účelem „escapování“ je změna významu znaku. V případě mezery „escapování“ zajistí, že s ní shell bude pracovat jako s běžným znakem, a nikoliv jako s oddělovačem parametrů.
Představme si, že chceme zobrazit obsah textového souboru pomocí příkazu `type`. Pokud je tento soubor umístěn v cestě `C:TestFile.txt`, následující příkaz jej bez problémů zobrazí:
type C:TestFile.txt
Vše funguje jak má. Co se však stane, pokud je soubor umístěn v cestě `C:Test FolderTest File.txt`? Pokud použijeme následující příkaz, neuspějeme, protože mezery v cestě způsobí potíže:
type C:Test FolderTest File.txt
Příkazová řádka interpretuje tento zápis tak, že se snažíme nalézt soubor s názvem `C:Test`, a ohlásí, že „nemůže najít zadanou cestu“.
Tři způsoby „escapování“ mezer v systémech Windows
Existují tři odlišné metody, jak „escapovat“ mezery v cestách k souborům v prostředí Windows:
- Uzavření celé cesty, nebo její části, do dvojitých uvozovek (
"
). - Vložení znaku stříšky (
^
) před každou mezeru. (Tento způsob je specifický pro příkazový řádek/CMD a nemusí fungovat se všemi příkazy.) - Přidání znaku obráceného apostrofu (
`
) před každou mezeru. (Tento způsob funguje výhradně v PowerShell a je spolehlivý.)
Nyní si podrobněji představíme každou z těchto metod.
Použití dvojitých uvozovek ("
)
Nejběžnější a univerzální způsob, jak zajistit, aby Windows správně zpracoval cestu k souboru, je uzavřít ji do dvojitých uvozovek. Například, namísto původního nefunkčního příkazu použijeme:
type "C:Test FolderTest File.txt"
Je možné obalit do uvozovek pouze části cesty, například takto:
type C:"Test Folder"File.txt
Nicméně, ve většině případů je nejjednodušší a nejvíce doporučované ohraničit uvozovkami celou cestu.
Tato metoda funguje bez problémů jak v klasickém příkazovém řádku (CMD), tak i v prostředí Windows PowerShell.
Znak stříšky (^
) – občasný pomocník
V prostředí příkazového řádku (CMD) lze pro „escapování“ mezer teoreticky použít znak stříšky (^
), který se umisťuje před každou mezeru v názvu souboru. Znak stříšky získáme kombinací kláves Shift+6.
Tento způsob má však svá specifika. Přestože by měl fungovat, a někdy i funguje, není jeho chování zcela konzistentní.
Pokud bychom tedy zkusili výše uvedený příklad s textovým souborem:
type C:Test^ FolderTest^ File.txt
Nepovedlo by se nám zobrazit obsah textového souboru.
Na druhou stranu, když zkusíme cestu souboru zadat přímo do příkazového řádku, vidíme, že mezery jsou pomocí stříšky správně „escapovány“:
C:Test^ FolderTest^ File.txt
Kdy tedy znak stříšky funguje? Zjistili jsme, že jeho funkčnost se liší v závislosti na použité aplikaci a konkrétním příkazu. Chování stříšky v příkazovém řádku je tedy poněkud nepředvídatelné.
Pro maximální spolehlivost je v prostředí CMD lepší používat dvojité uvozovky. Alternativou je přejít do PowerShellu a využít metodu s obráceným apostrofem (`
), o které pojednáváme dále.
PowerShell a obrácený apostrof (`
)
V prostředí PowerShell je pro „escapování“ mezer určen obrácený apostrof (`
), který se vkládá před každou mezeru v názvu souboru. Získáte jej stisknutím klávesy, která se nachází nad klávesou Tab a pod klávesou Esc.
type C:Test` FolderTest` File.txt
Každý obrácený apostrof dá PowerShellu pokyn, aby „escapoval“ následující znak, a to včetně mezery.
Je důležité si uvědomit, že tato metoda funguje pouze v PowerShellu. V příkazovém řádku je nutné použít stříšku (^
) nebo raději dvojité uvozovky ("
).
Uživatelé operačních systémů podobných UNIXu (Linux, macOS) mohou být zvyklí používat zpětné lomítko (\
) před mezerou. Ve Windows je však zpětné lomítko využíváno pro oddělování složek v cestách, a proto pro „escapování“ mezer slouží stříška (^
) pro CMD a obrácený apostrof (`
) pro PowerShell.