Jak uniknout mezerám v cestách souborů na příkazovém řádku Windows

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.