Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 07:25
Оценка: 2 (2) -1 :)
Вот, допустим, хотите вы в PowerShell получить список файлов в папке, смотрите доку: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.4

Get-ChildItem -Path


Вроде все просто. Но!

Это не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит

D:\folder_[10]\subfolder1


И нужно использовать не -Path а -LiteralPath.

Знали ли вы об этом? Вот пока не столкнешься — будешь верить что код работает и там же все просто. Ан, нет, что еще раз доказывает тезис — наш мир только в теории кажется простым, пока не попытаешься что-либо сделать.

Как нужно бороться с подобными ошибками?

З.Ы.
Причина в том, что на самом деле это не -Path а шаблон. И символы [] — воспринимает как часть шаблона для поиска — типа [bc]ook matches book and cook. Так же можно использовать и традиционные ? и *, но еще решили добавить и свои кастомные [], которые отдельно могут быть именем папки.
Отредактировано 11.07.2024 4:22 Shmj . Предыдущая версия . Еще …
Отредактировано 10.07.2024 7:26 Shmj . Предыдущая версия .
Re: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Нomunculus Россия  
Дата: 10.07.24 07:32
Оценка: +1
Здравствуйте, Shmj, Вы писали:

Python изучаю. Жаль что не начал делать этого раньше. Очень клевая штука
Вот он как раз для таких задачек.

Так что совет — не использовать всякую фигню
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 07:49
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Python изучаю. Жаль что не начал делать этого раньше. Очень клевая штука


Так PowerShell — работает по умолчанию без установки чего-либо дополнительного.
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Нomunculus Россия  
Дата: 10.07.24 07:50
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Нomunculus, Вы писали:


Н>>Python изучаю. Жаль что не начал делать этого раньше. Очень клевая штука


S>Так PowerShell — работает по умолчанию без установки чего-либо дополнительного.


Ты ж на маке. Там как раз питон
Re[4]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 08:16
Оценка: :)
Здравствуйте, Нomunculus, Вы писали:

Н>Ты ж на маке. Там как раз питон


Я везде. Будущее за кросс-платформой, т.е всеядностью. Когда вы кушаете только одну еду и брезгуете другой — то будете как Панды — выживите лишь в искусственных условиях по милости господ, если будете достаточно мягкими и пушистыми.
Re[5]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Нomunculus Россия  
Дата: 10.07.24 08:18
Оценка: +1
Здравствуйте, Shmj, Вы писали:

Питон-то как раз и ВЕЗДЕ. А повершелл — нет
Re[5]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Muxa  
Дата: 10.07.24 09:34
Оценка: +2
Будущее за кросс-платформой, поэтому пишу скрипты на повершелле. Логика.
Re[6]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: vsb Казахстан  
Дата: 10.07.24 09:34
Оценка:
Здравствуйте, Нomunculus, Вы писали:

Н>Питон-то как раз и ВЕЗДЕ. А повершелл — нет


На винде нет питона.

Вообще между, скажем, виндой и маком кажется нет никакого общего фундамента (в плане скриптовых языков).
Re: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 09:39
Оценка: +2 -1
Здравствуйте, Shmj, Вы писали:

S>Это не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит


Не "игнорит", а интерпретирует символы, как элемент шаблона (wildcard), наравне с традиционными "*" и "?".

S>И нужно использовать не -Path а -LiteralPath.


Как и во всех остальных языках/утилитах, которые предполагают в строках наличие метасимволов, или экранировать их предусмотренным образом.

S>Знали ли вы об этом?


Я не знал (редко использую PowerShell), но из документации по Вашей ссылке это видно однозначно. Уже само наличие -LiteralPath в дополнение к -Path должно было навести на мысль, если бы Вы начали с документации.

S>Как нужно бороться с подобными ошибками?


Не делать вида, будто, взяв нагугленный где-то готовый пример, и наскоро переделав под себя, Вы действительно "смотрели доку" до того, а не после того, как нарвались.
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 10:05
Оценка: -2 :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Не "игнорит", а интерпретирует символы, как элемент шаблона (wildcard), наравне с традиционными "*" и "?".


Но ведь * и ? — запрещены в названиях папок и файлов — здесь вопросов нет. А вот [] — разрешены, по этому просто так использовать их как спец. символы — было не разумно.

S>>И нужно использовать не -Path а -LiteralPath.


ЕМ>Как и во всех остальных языках/утилитах, которые предполагают в строках наличие метасимволов, или экранировать их предусмотренным образом.


Так это же не к строке относится — в строках они ничего не значат. Это именно к -Path. Причем для New-Item, к примеру, — нет особого Literal-Path — только -Path.

S>>Знали ли вы об этом?


ЕМ>Я не знал (редко использую PowerShell), но из документации по Вашей ссылке это видно однозначно. Уже само наличие -LiteralPath в дополнение к -Path должно было навести на мысль, если бы Вы начали с документации.


В первом примере нет -LiteralPath.

S>>Как нужно бороться с подобными ошибками?

ЕМ>Не делать вида, будто, взяв нагугленный где-то готовый пример, и наскоро переделав под себя, Вы действительно "смотрели доку" до того, а не после того, как нарвались.

Если в доке будут такие подлянки — то ты ее будешь учить годами и все-равно знать не будешь. Пока выучишь — язык станет не актуальным.
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 10:25
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Но ведь * и ? — запрещены в названиях папок и файлов — здесь вопросов нет. А вот [] — разрешены


Это вообще никак не связано. Про регулярные выражения слышали? В текстах, к которым они применяются, нужно запретить символы ".", "*", "+", скобки и прочее?

S>просто так использовать их как спец. символы — было не разумно.


Их используют не "просто так", а в средстве автоматизации, реализующем язык программирования. Неразумно — пользоваться подобными средствами так, как ими пользуется неграмотный юзер.

S>Так это же не к строке относится


Параметром -Path и -LiteralPath является строковый тип данных.

S>Причем для New-Item, к примеру, — нет особого Literal-Path — только -Path.


И почему же это, интересно? Попробую догадаться... А! Наверное, потому, что "шаблонная" интерпретация символов в New-Item не имеет смысла, да? Угадал?

S>В первом примере нет -LiteralPath.


Почему он должен быть непременно в первом примере, а не втором, пятом или двенадцатом?

S>Если в доке будут такие подлянки


В упомянутой доке нет никаких "подлянок" — все описано, как есть. То, что доку писали для тех, кто будет ее читать, а не проглядывать наскоро — проблема читателя, а не доки. Вы просто откровенно лопухнулись, но отчаянно не хотите этого признавать.

S>ты ее будешь учить годами


Учат доки только те, кто не понимает сути, и применяет средства тупо, по шаблону и аналогии. Те, кто понимает принцип устройства и работы, читают один раз полностью для общего понимания, затем читают только нужные фрагменты для освежения памяти.
Re[7]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.07.24 12:33
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>На винде нет питона.


Вот это спорный момент. Нет в инсталяторе? Да, нет. Но поставить его — пара кликов, можешь убедиться в этом на apps.microsoft.com. Так что я бы не делал из этого проблемы.
Re[8]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: vsb Казахстан  
Дата: 10.07.24 12:55
Оценка:
Здравствуйте, Nuzhny, Вы писали:

vsb>>На винде нет питона.


N>Вот это спорный момент. Нет в инсталяторе? Да, нет. Но поставить его — пара кликов, можешь убедиться в этом на apps.microsoft.com. Так что я бы не делал из этого проблемы.


Думаю, что и power shell на макоси поставить можно в пару условных кликов. Да и что угодно где угодно.

Когда питон появится в только что установленной винде, тогда будет такой вариант. Вот в макоси он стоит, хотя там свои нюансы и его вообще не рекомендуется использовать для своих скриптов, но технически он есть и работает. В линуксах — тут, конечно, где как, но в большинстве дистрибутивов не в минимальных установках он таки тоже есть. А в винде — нет. Там только bat-файлы из всем известного. В последнее время стали powershell ставить. Ну JS и VBS из экзотики вроде поддерживаются, хотя точно не уверен.
Отредактировано 10.07.2024 12:58 vsb . Предыдущая версия .
Re: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: m2user  
Дата: 10.07.24 12:59
Оценка:
S>Как нужно бороться с подобными ошибками?

IMHO, запутанное экранирование строк это общая проблема всех языков, предназначенных для shell scripting (powershell, posix shell).
Решение — по возможности не использовать shell scripting, оставив его сис.админам

По-моему под MS Windows ещё можно писать скрипты на VB script.
Re[9]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 10.07.24 13:00
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Думаю, что и power shell на макоси поставить можно в пару условных кликов. Да и что угодно где угодно.


И как?
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 13:18
Оценка:
Здравствуйте, m2user, Вы писали:

M>IMHO, запутанное экранирование строк это общая проблема всех языков, предназначенных для shell scripting (powershell, posix shell).


Это не экранирование строк. Я считываю имя файла в переменную, не пишу руками. И эту же переменную использую для поиска дочерних файлов:

function Process-Folder {
    param(
        [string]$folderPath
    )

    $items = Get-ChildItem -Path $folderPath -Force | Sort-Object Name

    foreach ($item in $items) {
        if ($item.PSIsContainer) {
            Process-Folder -folderPath $item.FullName
        } elseif ($item.Extension -eq ".zip") {
            Expand-ZipFile -zipFile $item.FullName
        }
    }
}


Т.е. вызываю эту функцию с корнем диска. Оно перебирает все папки, но не перебирает файлы внутри папки с [].
Re[4]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 10.07.24 13:28
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Это вообще никак не связано. Про регулярные выражения слышали? В текстах, к которым они применяются, нужно запретить символы ".", "*", "+", скобки и прочее?


А здесь я что, указывают регулярное выражение? Нет, конечно — я указываю путь к файлу.

Понятно что символы * и ? не могут быть в пути файла и используются шаблон. Но вот те символы которые могут быть частью имени файла или папки — с чего вдруг трактуются как шаблон?

S>>просто так использовать их как спец. символы — было не разумно.

ЕМ>Их используют не "просто так", а в средстве автоматизации, реализующем язык программирования. Неразумно — пользоваться подобными средствами так, как ими пользуется неграмотный юзер.

Это путь к файлу а не регулярное выражение.

S>>Так это же не к строке относится

ЕМ>Параметром -Path и -LiteralPath является строковый тип данных.

И что? Вы запутали человека выше — он подумал что проблема в экранировании символов, типа я написал символы \t и ожидал что они будет будет распарсены не как табуляция, а как буквальный слэш и буква t. Но здесь дело не в этом.

S>>Причем для New-Item, к примеру, — нет особого Literal-Path — только -Path.

ЕМ>И почему же это, интересно? Попробую догадаться... А! Наверное, потому, что "шаблонная" интерпретация символов в New-Item не имеет смысла, да? Угадал?

Т.е. вы считаете это нормальным? По идее нужно все-равно трактовать как шаблонные символы и выдавать ошибку.

S>>В первом примере нет -LiteralPath.


ЕМ>Почему он должен быть непременно в первом примере, а не втором, пятом или двенадцатом?


С 1 по 9 пример — получение файлов по пути — везде указан -Path. LiteralPath ни в одном примере нет

S>>Если в доке будут такие подлянки


ЕМ>В упомянутой доке нет никаких "подлянок" — все описано, как есть. То, что доку писали для тех, кто будет ее читать, а не проглядывать наскоро — проблема читателя, а не доки. Вы просто откровенно лопухнулись, но отчаянно не хотите этого признавать.


Кто еще так думает?
Re[5]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 14:38
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>А здесь я что, указывают регулярное выражение? Нет, конечно — я указываю путь к файлу.


В -Path Вы указываете шаблон пути к файлу. Это [p]явно[/p] указано в описании параметра ("Wildcards are accepted"). Но Вы решили, что описание параметров — не для Вас, и дочитали только до примеров. Само по себе это не страшно — я тоже периодически так нарываюсь. А вот то, что подняли хай насчет "подлянки" вместо того, чтоб самого себя стукнуть по голове — это уровень тупого юзера, а не программиста.

S>те символы которые могут быть частью имени файла или папки — с чего вдруг трактуются как шаблон?


С того, что шаблон в PowerShell может содержать символы, допустимые в имени файла. Точно так же, регулярное выражение, применяемое к произвольному тексту, не накладывает никаких ограничений на символьный состав текста. Если Вас это удивляет, Вам необходимо углубить образование.

S>Это путь к файлу а не регулярное выражение.


Это шаблон пути к файлу. То есть, это текстовое выражение, описывающие множество подходящих под него путей.

S>Вы запутали человека выше — он подумал что проблема в экранировании символов


Я плохо знаком с синтаксисом PowerShell — возможно, там есть и возможность экранирования. Но экранирование не решает всех возможных проблем, поэтому и существует -LiteralPath.

ЕМ>>Наверное, потому, что "шаблонная" интерпретация символов в New-Item не имеет смысла, да?


S>Т.е. вы считаете это нормальным?


Абсолютно. Если Вы считаете это ненормальным, то Вы определенно занимаетесь не своим делом.

S>По идее нужно все-равно трактовать как шаблонные символы и выдавать ошибку.


С чего вдруг? New-Item создает конкретный объект с полностью определенным именем. Как Вы представляете себе создание объекта, имя которого представлено шаблоном? А Get-Item/Get-ChildItem выбирают множество существующих объектов, имена которых подпадают под заданное условие (шаблон).

S>С 1 по 9 пример — получение файлов по пути — везде указан -Path. LiteralPath ни в одном примере нет


Re[9]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 14:42
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А в винде — нет. Там только bat-файлы из всем известного. В последнее время стали powershell ставить.


Да, всего-то с 2009-го, буквально со вчерашнего дня.

Кстати, PowerShell есть под Linux и MacOS.
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 14:49
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Я считываю имя файла в переменную, не пишу руками. И эту же переменную использую для поиска дочерних файлов


Если переменная содержит точное имя файла, а не выражение, описывающее возможные имена, то Вы должны использовать соответствующие средства, а не первое подходящее.

Во многих ЯП функции поиска по тексту принимают в качестве образца регулярное выражение. По умолчанию оно начинается со слэша, поэтому попытка найти буквальную (literal) последовательность "/abc/" найдет вовсе не ее. Используя программные средства, программист обязан знать особенности их работы, и не возмущаться, если они работают, как описано, а не как он интуитивно предполагал.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.