Квадратные скобки в именах файлов

Вы наверное знаете, что в PowerShell, в качестве подстановочных знаков можно использовать не только ? и * как в cmd.exe, но и группы символов в квадратных скобках, например так:

substsquare

Это несомненно полезная возможность… но так как в файловой системе Windows допустимо использовать квадратные скобки в именах файлов, могут возникнуть некоторые проблемы при работе с такими файлами:

sqerr

Я думаю причины вполне понятны, командлет просто пытается найти файл начинающийся с test, у которого пятый 1, 2 или 3. Что же делать? Можно просто замаскировать с помощью обратных апострофов, а можно использовать параметр –LiteralPath (который присутствует и у многих других командлетов работающих с файлами:

PS C:\Temp> Get-Content '.\test`[123`].txt'
Some text
PS C:\Temp> Get-Content -LiteralPath .\test[123].txt
Some text

Если же вам надо передать имя такого файла внешней утилите, не понимающей квадратные скобки как группы символов, то можно обойтись и без маскировки:

PS C:\Temp> cmd.exe /c type .\test[123].txt
Some text
PS C:\Temp> notepad.exe .\test[123].txt

Я сейчас использую только PowerShell 2.0, так что если у вас в 1.0 что то работает иначе, – пишите, попробуем разобраться🙂

комментария 3 to “Квадратные скобки в именах файлов”

  1. Oleg Medvedev Says:

    В большинстве случаев от квадратных скобок спасает -LiteraPath.
    А вот от апострофов в путях он уже не спасает.
    Посто если мне напрямую надо обработать файл с известным именем, то проблем нет — я просто избегу апострофа, используя `.
    Но если обрабатывать файлы, полученные от других программ…
    Есть ли у Powershell какая-то функция для получения строки параметров как она есть, чтобы escapeить её, а потом дальше передать на обработку?

    С третьей стороны, если программу, генерирующую имена файлов для обработки, запустить из-под powershell, то она будет выдавать сгенерированные имена уже без апострофов — фильтр, похоже, встроен в обработчик stdout.

    Проблемка с этими служебными символами…
    То ли нужно делать глобальный выключатель этих шаблонных расширений, то ли действительно вводить функции escape/unescape.

  2. Kazun Says:

    to Oleg Medvedev

    filter Escape-Bracket {
    $_.psPath = $_.psPath -replace ‘\[|]’,’`$0′
    $_
    }
    http://www.sysadmins.lv/SearchView.aspx?q=literalpath

  3. Аноним Says:

    Мда, как же всё-таки хорошо в Линукс — в путях всё везде экранируется через \, как и в C/C++/C#.


Обсуждение закрыто.

%d такие блоггеры, как: