Подлянка с -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. Так же можно использовать и традиционные ? и *, но еще решили добавить и свои кастомные [], которые отдельно могут быть именем папки.
=сначала спроси у GPT=
Отредактировано 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 — работает по умолчанию без установки чего-либо дополнительного.
=сначала спроси у GPT=
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, Вы писали:

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


Я везде. Будущее за кросс-платформой, т.е всеядностью. Когда вы кушаете только одну еду и брезгуете другой — то будете как Панды — выживите лишь в искусственных условиях по милости господ, если будете достаточно мягкими и пушистыми.
=сначала спроси у GPT=
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>>Как нужно бороться с подобными ошибками?

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

Если в доке будут такие подлянки — то ты ее будешь учить годами и все-равно знать не будешь. Пока выучишь — язык станет не актуальным.
=сначала спроси у GPT=
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
        }
    }
}


Т.е. вызываю эту функцию с корнем диска. Оно перебирает все папки, но не перебирает файлы внутри папки с [].
=сначала спроси у GPT=
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>>Если в доке будут такие подлянки


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


Кто еще так думает?
=сначала спроси у GPT=
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/" найдет вовсе не ее. Используя программные средства, программист обязан знать особенности их работы, и не возмущаться, если они работают, как описано, а не как он интуитивно предполагал.
Re[6]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Shmj Ниоткуда  
Дата: 10.07.24 14:52
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Это [p]явно[/p] указано в описании параметра ("Wildcards are accepted").


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

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


ЕМ>В -Path Вы указываете шаблон пути к файлу.


Так может и стоило бы назвать -PathTemplate? Названо Path а реально имеем не Path а PathTemplate.

Не было бы проблем, если бы шаблонные символы были стандартными и запрещены в именах файлов. Но здесь нет — здесь есть символы, которые в именах файлах так же разрешены.

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


Имя с шаблоными символами создать не возможно, по этому должно вернуть ошибку. Аналогично, если бы вы попытались использовать символ * в имени файла.

По уму, если они вводят сверх стандартных символов * ? еще и какие-то свои, которые могут быть частью имени файла — то назвать PathTemplate

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

ЕМ>

Просьба ответить по существу. Откуда я должен знать что Path — это не путь а какой-то шаблон пути с символами, которые они сами решили назначить управляющими и которые могут быть частью имени файла?
=сначала спроси у GPT=
Отредактировано 10.07.2024 14:53 Shmj . Предыдущая версия .
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 14:58
Оценка:
Здравствуйте, Shmj, Вы писали:

S>вызываю эту функцию с корнем диска. Оно перебирает все папки, но не перебирает файлы внутри папки с [].


Ваш пример точно работает после замены -Path на -LiteralPath в -Get-ChildItem?

Если в строке, передаваемой в -Path, нет шаблонных выражений, она интерпретируется, как литеральная. Если Вы указываете "-Path c:\", то шаблонной интерпретации не происходит — формируется полный список подкаталогов корневого каталога, и никакой фильтрации по именам там нет. Если в корневом каталоге есть имена, содержащие квадратные скобки — они так же включаются в список.

А если Вы полученные имена затем передаете параметром в другие операции, указывая их, как шаблоны, а не буквальные строки, то операция интерпретирует их, как шаблон.
Re[4]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Shmj Ниоткуда  
Дата: 10.07.24 15:39
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Ваш пример точно работает после замены -Path на -LiteralPath в -Get-ChildItem?


ЕМ>Если в строке, передаваемой в -Path, нет шаблонных выражений, она интерпретируется, как литеральная. Если Вы указываете "-Path c:\", то шаблонной интерпретации не происходит — формируется полный список подкаталогов корневого каталога, и никакой фильтрации по именам там нет. Если в корневом каталоге есть имена, содержащие квадратные скобки — они так же включаются в список.


ЕМ>А если Вы полученные имена затем передаете параметром в другие операции, указывая их, как шаблоны, а не буквальные строки, то операция интерпретирует их, как шаблон.


Там же рекурсивная функция — она вызывает саму себя для каждого ChildItem, если он папка.

И среди подпапок есть те, которые содержат в названии папки []
=сначала спроси у GPT=
Отредактировано 10.07.2024 15:58 Shmj . Предыдущая версия .
Re[7]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 16:06
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Так обычно под этим подразумеваются стандартные управляющие символы, которые не могут совпадать с именем файла или папки.


Это нужно читать, как "я это всегда подразумевал, и самонадеянно полагал, что так везде и будет". И еще раз: то, что "*" и "?" не допускаются в именах файлов — следствие исключительно того, что этим символы выбраны в качестве шаблонных для пользовательских утилит. Средства программирования этой традиции следовать не обязаны, ибо не предназначены для рядового пользователя.

А мне вот традиционных "*" и "?" никогда не хватало, поэтому в каждом новом языке/средстве я первым делом смотрю, как там интерпретируются шаблоны, допускаются ли регулярные выражения и т.п.

S>Так может и стоило бы назвать -PathTemplate?


С этим согласен. Но разработчики PowerShell, как и в свое время bash, руководствовались весьма странной логикой. Что-то сделали очень удобно, а что-то — откровенно уродливо и громоздко. Судя по всему, и там, и там сперва пытались выдержать какой-то единый стиль, но в итоге нагромоздили столько исключений, что того стиля почти не видно.

S>Не было бы проблем, если бы шаблонные символы были стандартными и запрещены в именах файлов.


В средствах программирования для этого нет ни малейшей необходимости. Не путайте с утилитами для необразованного конечного пользователя.

S>здесь есть символы, которые в именах файлах так же разрешены.


А в регулярных выражениях есть символы, которые разрешены в текстах. Пора бы уже понять эту простую идею, коли Вы сподобились заняться программированием.

S>Имя с шаблоными символами создать не возможно


Невозможно создать имя с запрещенным символом. Запрещенный символ в общем случае не является шаблонным, и шаблонные символы (опять же в общем случае) не обязаны быть запрещенными в именах.

S>По уму


Вас не удивляет, что, откровенно протупив во вполне очевидном вопросе, Вы упрекаете кого-то в нехватке ума?

S>если они вводят сверх стандартных символов * ? еще и какие-то свои, которые могут быть частью имени файла — то назвать PathTemplate


Стоило так назвать не потому, что символы допустимы или недопустимы в имени, а потому, что строки в -Path и -LiteralPath имеют разный смысл и, как следствие, разную интерпретацию. Когда обрабатывается шаблон, обработчику нет дела до того, какие символы допустимы или недопустимы в имени файла — он просто применяет к ним установленные правила.

S>Просьба ответить по существу.


Я уже по третьему разу разжевал, а Вам все непонятно. Это означает, что в обучении Вы прошли мимо определенных основ, без которых Ваши попытки программирования вырождаются в интуитивную переделку готовых примеров.

S>Откуда я должен знать что Path — это не путь а какой-то шаблон


Из документации, на которую сами же и дали ссылку в первом сообщении. Она написана для того, чтобы ее читали, а не просматривали по диагонали. Единственное, что в этой документации не совсем правильно — примеры почему-то идут до подробного описания параметров. Но эти описания таки есть, они не спрятаны под спойлеры, и даже не вынесены на отдельные страницы. Если Вам раньше приходилось читать документацию по средствам программирования, то Вы не могли не знать, что любые синтаксические элементы, упомянутые в общем описании, непременно подробно описаны где-то далее. Иначе не бывает.

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

S>Там же рекурсивная функция — она вызывает саму себя для каждого ChildItem, если он папка.


Я не люблю без крайней нужды разбирать чужой код, предпочитая описание.

S>И среди подпапок есть те, которые содержат в названии папки []


В описании проблемы Вы утверждали, будто Get-ChildItem "просто игнорит" такие папки. То есть, Вы еще и толком не поняли, как работает Ваш собственный код, что возвращает Get-ChildItem, что передается в функцию и т.п. Могли бы тупо вставить отладочные печати — возможно, это навело бы на правильные мысли. Вместо этого, Вы ринулись сюда размахивать флагом. А потом удивляетесь, когда Вас воспринимают, как клоуна-бездельника.
Re[6]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Shmj Ниоткуда  
Дата: 10.07.24 16:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>И среди подпапок есть те, которые содержат в названии папки []


ЕМ>В описании проблемы Вы утверждали, будто Get-ChildItem "просто игнорит" такие папки.


Ну вот когда спускается вниз и доходит до папки, в названии которое есть [] и пытается получить детей — то возвращает пустой список.

ЕМ>То есть, Вы еще и толком не поняли, как работает Ваш собственный код, что возвращает Get-ChildItem, что передается в функцию и т.п. Могли бы тупо вставить отладочные печати — возможно, это навело бы на правильные мысли. Вместо этого, Вы ринулись сюда размахивать флагом. А потом удивляетесь, когда Вас воспринимают, как клоуна-бездельника.


С чего не понял? Я так и сделал — поставил вывод каждой папки в консоль. Потом запустил в режиме отладки и увидел что когда Path содержит папку, в названии которой есть [] — то детей не возвращает, как будто папка пустая, а она нифига не пустая.
=сначала спроси у GPT=
Re[7]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 16:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ну вот когда спускается вниз и доходит до папки, в названии которое есть [] и пытается получить детей — то возвращает пустой список.


В исходном сообщении Вы описали проблему не так. Там написано: "Get-ChildItem -Path ... не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит".

Если Вы выполните (хоть вручную) "Get-ChildItem -Path . -Recurse", то получите содержимое всех папок дерева, независимо от их имен. То есть, Вы описали проблему некорректно — дело не в тех символах, что в именах папок/файлов, а в тех, что в параметре -Path. Более корректное описание выглядело бы примерно так: "при указании в параметре -Path строки с символами [], папки с такими именами не находятся".
Re[8]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Shmj Ниоткуда  
Дата: 10.07.24 17:04
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В исходном сообщении Вы описали проблему не так. Там написано: "Get-ChildItem -Path ... не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит".


Именно так.

ЕМ>Если Вы выполните (хоть вручную) "Get-ChildItem -Path . -Recurse",


Про -Recurse речи не было.

Мне не подходит -Recurse, т.к. там 2 млн. папок очень долго ждать пока оно соберет весь список. По этому обхожу рекурсивно в ручном режиме папка за папкой.

ЕМ>То есть, Вы описали проблему некорректно — дело не в тех символах, что в именах папок/файлов, а в тех, что в параметре -Path. Более корректное описание выглядело бы примерно так: "при указании в параметре -Path строки с символами [], папки с такими именами не находятся".


Я сроку не указываю а передаю результат, который вернула Get-ChildItem.

Если бы я написал так — то можно было бы подумать, что символы [] являются управляющими внутри строки (типа символа $) и я просто забыл их заэкранировать. Но нет, я не пишу строку вручную — а просто подсовываю переменную с тем значением, которое вернула сама же Get-ChildItem.
=сначала спроси у GPT=
Отредактировано 10.07.2024 17:06 Shmj . Предыдущая версия .
Re[9]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 17:18
Оценка:
Здравствуйте, Shmj, Вы писали:

ЕМ>>Там написано: "Get-ChildItem -Path ... не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит".


S>Именно так.


Нет, не так. Повторяю: проблема не в том, какие символы в именах папок, а в том, какие символы в параметре -Path.

S>Я сроку не указываю а передаю результат, который вернула Get-ChildItem.




Ваши проблемы от того, что Вы лезете в профессиональную сферу с замашками типичного потребителя. Выходов только два: либо изучать предметную область (становиться профессионалом), либо пользоваться только средствами, ориентированными на потребителя (есть визуальные средства автоматизации, где можно мышкой накликать типовые условия и действия).

S>можно было бы подумать, что символы [] являются управляющими внутри строки


Об этом не нужно как-то дополнительно думать — они действительно являются "управляющими" в том смысле, что имеют значение, отличное от буквального. И сам факт наличия параметра -LiteralPath должен сразу же наводить на мысль, что он существует неспроста.

S>(типа символа $) и я просто забыл их заэкранировать.


Это если там вообще предусмотрена возможность экранирования.

S>Я не пишу строку вручную — а просто подсовываю переменную




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

ЕМ>Нет, не так. Повторяю: проблема не в том, какие символы в именах папок, а в том, какие символы в параметре -Path.


В параметре Path указан путь к папке. Если путь содержит в себе символы [] — то это не работает. Поведение не очевидно.

То что это не путь а шаблон с какими-то своими правилами — не очевидно.

Причем для других команд этот же Path уже трактует символы не как шаблонные.

S>>Я сроку не указываю а передаю результат, который вернула Get-ChildItem.


ЕМ>


ЕМ>Ваши проблемы от того, что Вы лезете в профессиональную сферу с замашками типичного потребителя. Выходов только два: либо изучать предметную область (становиться профессионалом), либо пользоваться только средствами, ориентированными на потребителя (есть визуальные средства автоматизации, где можно мышкой накликать типовые условия и действия).


Вы на личности не переходите, а отвечайте по существу.

Люди мне благодарны, т.к. это поведение не выглядит очевидным. Зачем вы беретесь защищать глупость — не ясно.

S>>можно было бы подумать, что символы [] являются управляющими внутри строки


ЕМ>Об этом не нужно как-то дополнительно думать — они действительно являются "управляющими" в том смысле, что имеют значение, отличное от буквального. И сам факт наличия параметра -LiteralPath должен сразу же наводить на мысль, что он существует неспроста.


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

S>>(типа символа $) и я просто забыл их заэкранировать.

ЕМ>Это если там вообще предусмотрена возможность экранирования.

Управляющие символы внутри строки (обычно \) всегда во всех языках можно заэкранировать — иначе глупость получится, что невозможно записать строку с некими символами. Но здесь другой случай.

S>>Я не пишу строку вручную — а просто подсовываю переменную

ЕМ>
ЕМ>Попробуйте все-таки начать изучать программирование, с азов. Иногда это помогает.

Давай конкретно. Написать строку вручную — можно не учесть экранирования символов. И я подчеркнул что строку не писал вручную — даю значение переменное, которую сформировал сам же Get-ChildItem.
=сначала спроси у GPT=
Re[11]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 10.07.24 18:37
Оценка:
Здравствуйте, Shmj, Вы писали:

S>В параметре Path указан путь к папке.


Нет. В параметре указано строковое выражение, трактуемое, как шаблон пути к папке.

S>Поведение не очевидно.


С чего Вы взяли, что поведение должно быть очевидным? В технике (не только в программировании) поведение бывает либо соответствующим технической документации (правильным, ожидаемым), либо не соответствующим (неправильным, ошибочным). Очевидность, интуитивная понятность, удобство, наглядность и т.п. — приятные бонусы, не более того.

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


Исключительно для неучей и упрямцев.

S>Причем для других команд этот же Path уже трактует символы не как шаблонные.


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

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

S>Вы на личности не переходите, а отвечайте по существу.


По существу я Вам ответил уже несколько раз, а уважения к личности Вы пока не заслужили. Вперлись со свиным рылом в калашный ряд, и продолжаете упорствовать в своих заблуждениях — извольте терпеть заслуженные издевки. Или идите в форум юзеров, интуитивно осваивающих азы программирования методом копипасты. Там, возможно, многие будут воспринимать Вас, как гуру.

S>Люди мне благодарны


Которые? Где?

S>т.к. это поведение не выглядит очевидным.


Так я согласился с Вами в том, что имя параметра выбрано не совсем удачно. Чтобы понять, почему так получилось, нужно изучать историю разработки PowerShell. Поскольку она сильно смахивает на bash, к ее разработке явно приложили руки соответствующие фанаты. А поскольку в основе работы с данными в языке bash лежит текстовая подстановка, и там любой путь является шаблоном, то и PowerShell исходно могли проектировать на том же принципе, но в какой-то момент одумались.

S>Зачем вы беретесь защищать глупость


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

ЕМ>>-LiteralPath


S>В примерах работы с файловой системой он не задействован.


В любой документации примеры являются лишь приятным дополнением, и никогда не являются обязательной частью. Если Вам удобнее изучать средства программирования именно на примерах — ищите литературу вида "XXX в примерах и картинках". Только не обижайтесь, если там будет приписка "для чайников", "для нубов" и т.п.

S>Возможно что он нужен для работы с другими ресурсами, не с файлами.


Что значит "возможно"? Вы ж еще в первом сообщении вроде как пришли к выводу, что это именно то, что и требуется в задачах вроде Вашей.

S>Управляющие символы внутри строки (обычно \) всегда во всех языках можно заэкранировать


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

S>иначе глупость получится, что невозможно записать строку с некими символами.


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

S>я подчеркнул что строку не писал вручную — даю значение переменное, которую сформировал сам же Get-ChildItem.


Вы где-то в документации видели утверждения о том, что эти случаи должны обрабатываться по-разному? Или утверждения, что строка, возвращенная некой операцией, должна трактоваться как-то иначе, чем строка, указанная литералом, сформированная при вычислении выражения и т.п.?
Re[10]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: vsb Казахстан  
Дата: 10.07.24 20:09
Оценка: 2 (1) +1
Здравствуйте, Nuzhny, Вы писали:

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


N>И как?


brew install powershell/tap/powershell

Если человек использует скрипты, скорей всего homebrew у него есть.

Ну или скачать pkg и протыкать в инсталляторе.
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 11.07.24 04:19
Оценка: -1
Здравствуйте, Евгений Музыченко, Вы писали:

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


Почему видно что это шаблон, а не путь? Написано путь. На счет традиционных — нет проблем, они по общим договоренностям не могут быть именем файла. А почему какие-то кастомные ввели, причем в доке по приведенной мной ссылке нет ни одного примера, где бы список файлов получали через -LiteralPath, нет ни слова о том что это шаблон с какими-то своими кастомными символами.
=сначала спроси у GPT=
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Doom100500 Израиль  
Дата: 11.07.24 05:15
Оценка:
Здравствуйте, Нomunculus, Вы писали:

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


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

Н>Вот он как раз для таких задачек.

Н>Так что совет — не использовать всякую фигню


Питон? длай варианта команды dir (ls)?
Ну вы, блин, даёте.

ЗЫ: PS — для этого тоже выглядит монструозно.
Спасибо за внимание
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.07.24 08:48
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Почему видно что это шаблон, а не путь?


Потому, что об этом говорит документация.

S>Написано путь.


Если Вы про буквальную интерпретацию имени параметра (-Path), то это действительно некий путь, определяющий местонахождение требуемой сущности. От того, что путь может содержать метасимволы, он не перестает быть путем.

S>А почему какие-то кастомные ввели, причем в доке по приведенной мной ссылке нет ни одного примера, где бы список файлов получали через -LiteralPath


Вы определенно занимаетесь не своим делом. Ваши рассуждения об этом не просто глупы — они убоги, и вызывают даже не столько недовольство и злость, сколько брезгливость.

S>нет ни слова о том что это шаблон с какими-то своими кастомными символами.


Я Вам уже приводил цитату с нужными словами со страницы по Вашей собственной ссылке. Но, если то, что Вы ошибочно принимаете за гордость, не позволяет Вам признать свою ошибку — продолжайте исходить на дерьмо и дальше, а мне надоело.
Re[4]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
От: Shmj Ниоткуда  
Дата: 11.07.24 18:46
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Почему видно что это шаблон, а не путь?

ЕМ>Потому, что об этом говорит документация.

К именованиям нужно подходить очень тщательно, дабы не вводить в заблуждение.

А то назовете палец — а это жопа. А почему жопа, ведь а написано палец? А ты в документацию посмотри.

Глупостей не говорите.

ЕМ>Вы определенно занимаетесь не своим делом.


Если вы так и в своих проектах именуете сущности — то я бы вас на работу брать никому не рекомендовал. Вы хотя бы посмотрели бы на стартовое сообщение — люди мне благодарны.
=сначала спроси у GPT=
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.