Можно ли в Windows использовать квадратные скобки в именах папок и файлов? В принципе это не запрещено, однако при работе с подобными именами из PowerShell может возникнуть интересная проблема.
Для примера возьмем папку Folder1, расположенную в директории D:\Docs. Первым делом проверяем наличие исходной папки:
Get-ChildItem D:\Docs
и ее доступность:
Test-Path D:\Docs\Folder1
Как видите, пока исходная папка доступна.
Теперь переименуем ее в [001]:
Rename-Item -Path "D:\Docs\Folder1" -NewName "[001]"
и еще раз проверим, что папка успешно переименовалась и находится на том же месте.
На первый взгляд все нормально, но при попытке проверить доступность папки с новым именем мы получим отрицательный результат:
Test-Path "D:\Docs\[001]"
А попытка перейти в папку завершится с ошибкой:
Set-Location "D:\Docs\[001]"
Ситуация странная, папка вроде бы и есть, но PowerShell ее не видит. При этом папка доступна и из проводника, и из командной консоли. А дело в том, что квадратные скобки в PowerShell могут использоваться в качестве подстановочных символов (Wildcards). Соответственно группа символов в квадратных скобках означает один любой символ из находящихся в скобках. И получается, что указав путь D:\Docs\[001] на самом деле мы ищем в папке Docs объекты с именем 0 или 1. Для проверки этой гипотезы добавим в папку пару файлов с такими именами и выполним команду:
Get-ChildItem "D:\Docs\[001]" -Recurse
Как видите, команда нашла оба файла, поскольку они подошли под критерии поиска.
Во избежание подобных проблем лучше всего не использовать квадратные (да и любые другие) скобки в именах файлов. Если же это невозможно, то для работы с подобными путями нужно использовать параметр LiteralPath, который воспринимает подстановочные символы как обычные. Практически все командлеты PowerShell для работы с файлами имеют этот параметр.
Для проверки перейдем в папку:
Set-Location -LiteralPath "D:\Docs\[001]"
Выведем ее содержимое:
Get-ChildItem -LiteralPath "D:\Docs\[001]"
и проверим доступность:
Test-Path -LiteralPath "D:\Docs\[001]"
Как вариант можно попробовать заэкранировать кавычки с помощью обратного апострофа (`), например так:
Test-Path 'D:\Docs\`[001`]'
Но этот способ работает не со всеми командлетами.
Такие вот дела 🙂