Заметки о Windows и других программных продуктах Microsoft...

PowerShell и квадратные скобки

PowerShell и квадратные скобки

Можно ли в 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]"

ключ -LiteralPath

 

Как вариант можно попробовать заэкранировать кавычки с помощью обратного апострофа (`), например так:

Test-Path 'D:\Docs\`[001`]'

Но этот способ работает не со всеми командлетами.

экранирование с помощью обратного апострофа

 

Такие вот дела 🙂

 
 
Комментарии

Пока нет комментариев.