Это не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит
D:\folder_[10]\subfolder1
И нужно использовать не -Path а -LiteralPath.
Знали ли вы об этом? Вот пока не столкнешься — будешь верить что код работает и там же все просто. Ан, нет, что еще раз доказывает тезис — наш мир только в теории кажется простым, пока не попытаешься что-либо сделать.
Как нужно бороться с подобными ошибками?
З.Ы.
Причина в том, что на самом деле это не -Path а шаблон. И символы [] — воспринимает как часть шаблона для поиска — типа [bc]ook matches book and cook. Так же можно использовать и традиционные ? и *, но еще решили добавить и свои кастомные [], которые отдельно могут быть именем папки.
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Нomunculus, Вы писали:
Н>>Python изучаю. Жаль что не начал делать этого раньше. Очень клевая штука
S>Так PowerShell — работает по умолчанию без установки чего-либо дополнительного.
Ты ж на маке. Там как раз питон
Re[4]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, Нomunculus, Вы писали:
Н>Ты ж на маке. Там как раз питон
Я везде. Будущее за кросс-платформой, т.е всеядностью. Когда вы кушаете только одну еду и брезгуете другой — то будете как Панды — выживите лишь в искусственных условиях по милости господ, если будете достаточно мягкими и пушистыми.
Re[5]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, Shmj, Вы писали:
S>Это не работает для папок, в пути которых есть символы []. Содержание таких папок просто игнорит
Не "игнорит", а интерпретирует символы, как элемент шаблона (wildcard), наравне с традиционными "*" и "?".
S>И нужно использовать не -Path а -LiteralPath.
Как и во всех остальных языках/утилитах, которые предполагают в строках наличие метасимволов, или экранировать их предусмотренным образом.
S>Знали ли вы об этом?
Я не знал (редко использую PowerShell), но из документации по Вашей ссылке это видно однозначно. Уже само наличие -LiteralPath в дополнение к -Path должно было навести на мысль, если бы Вы начали с документации.
S>Как нужно бороться с подобными ошибками?
Не делать вида, будто, взяв нагугленный где-то готовый пример, и наскоро переделав под себя, Вы действительно "смотрели доку" до того, а не после того, как нарвались.
Re[2]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Не "игнорит", а интерпретирует символы, как элемент шаблона (wildcard), наравне с традиционными "*" и "?".
Но ведь * и ? — запрещены в названиях папок и файлов — здесь вопросов нет. А вот [] — разрешены, по этому просто так использовать их как спец. символы — было не разумно.
S>>И нужно использовать не -Path а -LiteralPath.
ЕМ>Как и во всех остальных языках/утилитах, которые предполагают в строках наличие метасимволов, или экранировать их предусмотренным образом.
Так это же не к строке относится — в строках они ничего не значат. Это именно к -Path. Причем для New-Item, к примеру, — нет особого Literal-Path — только -Path.
S>>Знали ли вы об этом?
ЕМ>Я не знал (редко использую PowerShell), но из документации по Вашей ссылке это видно однозначно. Уже само наличие -LiteralPath в дополнение к -Path должно было навести на мысль, если бы Вы начали с документации.
В первом примере нет -LiteralPath.
S>>Как нужно бороться с подобными ошибками? ЕМ>Не делать вида, будто, взяв нагугленный где-то готовый пример, и наскоро переделав под себя, Вы действительно "смотрели доку" до того, а не после того, как нарвались.
Если в доке будут такие подлянки — то ты ее будешь учить годами и все-равно знать не будешь. Пока выучишь — язык станет не актуальным.
Re[3]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, Shmj, Вы писали:
S>Но ведь * и ? — запрещены в названиях папок и файлов — здесь вопросов нет. А вот [] — разрешены
Это вообще никак не связано. Про регулярные выражения слышали? В текстах, к которым они применяются, нужно запретить символы ".", "*", "+", скобки и прочее?
S>просто так использовать их как спец. символы — было не разумно.
Их используют не "просто так", а в средстве автоматизации, реализующем язык программирования. Неразумно — пользоваться подобными средствами так, как ими пользуется неграмотный юзер.
S>Так это же не к строке относится
Параметром -Path и -LiteralPath является строковый тип данных.
S>Причем для New-Item, к примеру, — нет особого Literal-Path — только -Path.
И почему же это, интересно? Попробую догадаться... А! Наверное, потому, что "шаблонная" интерпретация символов в New-Item не имеет смысла, да? Угадал?
S>В первом примере нет -LiteralPath.
Почему он должен быть непременно в первом примере, а не втором, пятом или двенадцатом?
S>Если в доке будут такие подлянки
В упомянутой доке нет никаких "подлянок" — все описано, как есть. То, что доку писали для тех, кто будет ее читать, а не проглядывать наскоро — проблема читателя, а не доки. Вы просто откровенно лопухнулись, но отчаянно не хотите этого признавать.
S>ты ее будешь учить годами
Учат доки только те, кто не понимает сути, и применяет средства тупо, по шаблону и аналогии. Те, кто понимает принцип устройства и работы, читают один раз полностью для общего понимания, затем читают только нужные фрагменты для освежения памяти.
Re[7]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, vsb, Вы писали:
vsb>На винде нет питона.
Вот это спорный момент. Нет в инсталяторе? Да, нет. Но поставить его — пара кликов, можешь убедиться в этом на apps.microsoft.com. Так что я бы не делал из этого проблемы.
Re[8]: Подлянка с -Path/-LiteralPath в PowerShell - что дела
Здравствуйте, Nuzhny, Вы писали:
vsb>>На винде нет питона.
N>Вот это спорный момент. Нет в инсталяторе? Да, нет. Но поставить его — пара кликов, можешь убедиться в этом на apps.microsoft.com. Так что я бы не делал из этого проблемы.
Думаю, что и power shell на макоси поставить можно в пару условных кликов. Да и что угодно где угодно.
Когда питон появится в только что установленной винде, тогда будет такой вариант. Вот в макоси он стоит, хотя там свои нюансы и его вообще не рекомендуется использовать для своих скриптов, но технически он есть и работает. В линуксах — тут, конечно, где как, но в большинстве дистрибутивов не в минимальных установках он таки тоже есть. А в винде — нет. Там только bat-файлы из всем известного. В последнее время стали powershell ставить. Ну JS и VBS из экзотики вроде поддерживаются, хотя точно не уверен.
IMHO, запутанное экранирование строк это общая проблема всех языков, предназначенных для shell scripting (powershell, posix shell).
Решение — по возможности не использовать shell scripting, оставив его сис.админам
По-моему под MS Windows ещё можно писать скрипты на VB script.
Re[9]: Подлянка с -Path/-LiteralPath в PowerShell - что делать?
Здравствуйте, 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 - что делать?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Это вообще никак не связано. Про регулярные выражения слышали? В текстах, к которым они применяются, нужно запретить символы ".", "*", "+", скобки и прочее?
А здесь я что, указывают регулярное выражение? Нет, конечно — я указываю путь к файлу.
Понятно что символы * и ? не могут быть в пути файла и используются шаблон. Но вот те символы которые могут быть частью имени файла или папки — с чего вдруг трактуются как шаблон?
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 - что делать?
Здравствуйте, 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 - что дела
Здравствуйте, Shmj, Вы писали:
S>Я считываю имя файла в переменную, не пишу руками. И эту же переменную использую для поиска дочерних файлов
Если переменная содержит точное имя файла, а не выражение, описывающее возможные имена, то Вы должны использовать соответствующие средства, а не первое подходящее.
Во многих ЯП функции поиска по тексту принимают в качестве образца регулярное выражение. По умолчанию оно начинается со слэша, поэтому попытка найти буквальную (literal) последовательность "/abc/" найдет вовсе не ее. Используя программные средства, программист обязан знать особенности их работы, и не возмущаться, если они работают, как описано, а не как он интуитивно предполагал.