Оболочки командной строки, такие как командная строка Windows и PowerShell, используют пробелы для разделения команд и аргументов, но имена файлов и папок также могут содержать пробелы поэтому просто так их использовать пробелы нельзя. Давайте разберемся…
Почему стоит избегать использование пробелов при работе в коммандной строке
Пробел в пути папки или файла командная строка определяет как разделение команд и аргументов. Для того, чтобы использовать пробел как собственно пробел, прийдется весь пусть экранировать, а это требует отдельного внимания в зависимости от конкретной оболочки командной строки и программы, выполняемой в этой оболочке.
Кратко опишем проблему: например, у нас есть текстовый файл, который необходимо прочесть. Предположим этот файл расположен по адресу C:\Temp\TestFile.txt Для его прочтения необходимо выполнить команду
type C:\Temp\TestFile.txt
Отлично, а теперь представим, что прочесть теперь необходимо файл по адресу C:\Temp Folder\Test File.txt
Выполнив команду ниже вы со 100% вероятностью получите не вывод содержимого файла на экран, а ошибку — пробелы в пути файла не дадут команде выполниться корректно.
type C:\Temp Folder\Test File.txt
Три способа использовать знак пробела в пути Windows
Существует три способа использовать пробел в пути файлов:
- Заключить путь c пробелами в двойные кавычки ( » )
- Добавлять символ каре ( ^ ) перед каждый пробелом (работает только в командной строке CMD и только в определенных командах и программах)
- Добавлять знак ударения ( ` ) перед каждым пробелом (работает только в PowerShell, но работает всегда)
Рассмотрим каждый способ ближе.
Заключить путь в двойные кавычки
Стандартный метод точного указания пути к файлу в Windows — заключение его в двойные кавычки. Например, команда выдававшая ошибку в примере выше с кавычками в пути будет выглядеть так:
type "C:\Temp Folder\Test File.txt"
Так же, вы можете заключить лишь часть пути в двойные кавычки, например только ту часть, которая содержит в себе пробелы.
Представим, что в папке Temp Folder у нас находится файл TestFile.txt, в таком случае команда будет выглядеть так:
type "C:\Temp Folder"\TestFile.txt
Но, на практике такие кавычки использовать не лучшая мысль — это запутывает код и делает его менее гибким. Гораздо проще просто закрыть весь путь двойными кавычками.
Это решение работает как в традиционной среде командной строки (CMD), так и в Windows PowerShell.
Добавить символ каре с пробелами в командной строке
Теоретически символ каре в командной строке позволит вам пользоваться пробелами в пути файлов. Нужно просто добавлять символ перед каждым пробелом (Shift + 6 в английской раскладке).
На практике этот спецсимвол работает не каждый раз и очень часто программа завершается ошибкой.
Например, следующая команда должна выполниться без проблем, но она почему-то выдает ошибку
type C:\Temp^ Folder\Test^ File.txt
С другой стороны, если мы попробуем окрыть наш файл напрямую, введя его путь в командной строке и проставив символы каре, то увидим, что пробелы в пути файла обработались корректно:
C:\Temp^ Folder\Test^ File.txt
Таким образом, по своему опыту и поискав информацию в интернете мы приходим к выводу, что этот способ работает только с избранными программами и не дает полной уверенности в результате.
Вывод — пользуйтесь двойными кавычками в командной строке, или символом ударения в PowerShell, о котором ниже.
PowerShell символ ударения с пробелами в командной строке
PowerShell использует символ ударения в качестве экранирующего символа. Его нужно добавлять с каждым пробелом в имени файла (Этот символ спрятан на букве Ё на клавиатуре).
type C:\Temp` Folder\Test` File.txt
Каждый символ ударения указывает PowerShell как обрабатывать каждый последующий пробел.
Обратите внимание, что этот способ работает только в среде PowerShell, в командной строке придется использовать символ каретки, или, как уже писали выше, экранировать весь путь двойными кавычками.
Для пользователей UNIX-подобных систем напомним, что аналогичная проблема с пробелами в командной строке в Linux и MacOS решается использованием символа обратной косой черты ( \ ).