Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

Як масово перейменувати файли по масці в PowerShell - Вадим Стеркиной

  1. Перейменування файлів методом «пошук / заміна»
  2. вибірка файлів
  3. перейменування файлів
  4. Перейменування файлів шляхом додавання лічильника
  5. Примітка про блоках скриптів
  6. дискусія

невинний пост в групі ВК про поєднання клавіш провідника Ctrl + Shift + N раптово зачепив прихильників альтернативних файлових менеджерів. По ходу справи спливла тема масового перейменування файлів.

Євген Генеральчік помітив, що на відміну від Total Commander, провіднику не по зубам перейменування 20 тисяч файлів, наприклад, додавання до імені файлу поточної дати. Дійсно, в класичній серії пенальті я сам визнав незамінним поєднання Ctrl + M в TC, сфокусувавшись на функції пошуку / заміни.

Однак, відповідаючи Євгену в ВК, я помітив, що його завдання перейменування вирішу в PowerShell і навіть ванлайнером. Написав і подумав - треба все-таки вирішити, а то раптом попросять пруф :)

Перейменування файлів методом «пошук / заміна»

Через кілька хвилин у мене вийшов такий варіант:

Get-ChildItem -Path $ env: userprofile \ Downloads -Filter "* .zip *" -Recurse | `Rename-Item -NewName {$ _. Name -Replace" \ .zip $ "," - $ (Get-Date - Format {yyyy-MM-dd}). zip "} -WhatIf

Насправді в команді один рядок, а на дві я її розбив, щоб вона краще читалася. Давайте розберемо складові команди.

вибірка файлів

Для отримання списку файлів я використовую командлет Get-ChildItem. Він же gci, він же ls, він же Елла Кацнельбоген dir, а ця команда чудово знайома всім, хто написав хоч один батник.

  • -Path $ env: userprofile \ Downloads - файли шукаються по заданому шляху, тобто в папці Downloads в профілі користувача
  • -Filter "* .zip" - фільтруються тільки файли з розширенням ZIP. Втім, до вибірки потраплять також і файли, що містять в імені ".zip", але цим я знехтував. В принципі, можна не вказувати параметр, а просто написати .zip.
  • -Recurse - пошук ведеться рекурсивно, тобто у всіх вкладених папках. До речі, в PowerShell 5.0, тобто в Windows 10, у gci з'явився новий параметр -Depth, що задає глибину рекурсії. Наприклад, 0 - тільки поточна папка, 2 - на два рівня вглиб.

вибрані файли по конвеєру передаються далі для перейменування.

перейменування файлів

Командлет Rename-Item теж має добре відомим псевдонімом ren. За допомогою параметра -NewName задається нове ім'я, а в фігурних дужках стоїть вираз, що задає умови перейменування

  • $ _. Name - для кожного переданого по конвеєру файлу $ _ змінюється повне ім'я .Name
  • -Replace "\ .zip $", "-дата.zip" - я злегка спростив конструкцію, написавши дату словом, щоб був зрозумілий сенс аргументів оператора -Replace: Що шукаємо ',' на що міняємо '. Тут тонкість в тому, що у -Replace перший аргумент - регулярний вираз, а не просто знайти певний текст. У регулярних виразах точка означає будь-який символ, тому використання ".zip" загрожує небажаним перейменуванням, наприклад, файлу wi nzip -setup.exe.
  • "- $ (Get-Date -Format {yyyy-MM-dd}). Zip" - підставляємо ми все-таки поточну дату в форматі 2015-09-04. Формат дат я вже розбирав , А тут хочу звернути вашу увагу на інший фокус. Вираз (в даному випадку - командлет) не вийде вставити просто так в аргумент оператора, але його можна помістити між круглими дужками такої конструкції $ ().
  • -WhatIf - цей стандартний параметр в перекладі означає «що буде, якщо». Коли він доданий в команду, її реального виконання не відбувається, а в консоль виводиться результат того, що могло б статися без цього параметра. Іншими словами, ви можете перевірити команду у себе, не побоюючись, що всі архіви перейменуються :)

Перейменування файлів шляхом додавання лічильника

По ходу обговорення в ВК з'ясувалося, що приклад з датою надуманий, а більш реальною виглядає послідовна нумерація файлів. Дійсно, в TC я часто використовував дуже зручний лічильник [C] для перейменування графічних файлів.

У PowerShell його теж можна реалізувати. Припустимо, треба додати лічильник з трьох цифр в кінці імені всіх файлів JPG в цій папці. Команда може бути такою:

dir * .jpg | % {$ I = 1} {ren $ _ -NewName ( "$ ($ _. Basename) - {0:00 #}. Jpg" -f $ i ++) -WhatIf}

З вибіркою все зрозуміло, тому давайте розберемо перейменування.

  • % - псевдонім командлет Foreach-Object , Який перебирає по одному всі передані по конвеєру об'єкти. За ним слідують два блоки скриптів в фігурних дужках {}, про які трохи нижче.
  • {$ i = 1} - перший блок, в якому змінна i отримує значення 1. Це потрібно для лічильника, який після перейменування кожного об'єкта буде збільшуватися на одиницю за допомогою $ i ++.
  • ren $ _ - початок другого блоку для перейменування кожного отриманого по конвеєру об'єкта.
  • "$ ($ _. Basename) - {0: 0 #}. Png" - нове ім'я файлу. Конструкцію $ () я розбирав вище, але тут я використовую властивість Basename, тобто ім'я файлу без розширення (Name - ім'я файлу з розширенням).
    {0: 00 #} - лічильник, причому в даному випадку він тризначний, що визначається конструкцією з трьох символів 00 # після двокрапки. Еквівалентом буде {0: D3}, де число після D задає кількість символів лічильника.

Примітка про блоках скриптів

Існує три типи блоків:

  • Begin (початок) - виконується один раз на самому початку, до перебору елементів
  • Process (обробка) - виконується для кожного елемента
  • End (кінець) - виконується в самому кінці перебору

Командлет Foreach-Object обробляє блоки особливим чином. Якщо йому вказати тільки один блок, він сприймає його як Process. Якщо два, то перший буде Begin, а другий - Process (наш випадок). Якщо всі три, то поведінка стандартне: Begin → Process → End.

дискусія

Я не ставив перед собою завдання описати на мові PowerShell еквіваленти всіх функцій масового перейменування Total Commander. Думаю, що це цілком можливо, а ступінь успіху залежить лише від вашого рівня володіння PowerShell, .NET і гуглояндексом. Питання лише в тому, наскільки це доцільно.

Графічний інтерфейс TC зрозуміліше, наочніше і не вимагає спеціальної підготовки. Однак бувають ситуації, коли ви не зможете скористатися улюбленим інструментом. Наприклад, його немає в системі, а встановити не можна, оскільки ПК ізольований від зовнішнього середовища або це заборонено політикою організації. Якщо ви не лінуйтеся розширювати свій кругозір і не втрачаєте випадку поколупати PowerShell, ви з честю вийдете з такої ситуації.

До речі, в найближчих записах я познайомлю вас з деякими новими можливостями платформи PowerShell 5.0, включеної в Windows 10.

Розкажіть в коментарях, яке завдання ви в останній раз вирішували:

  • за допомогою PowerShell або іншого скриптового мови
  • засоби для масового перейменування в улюбленому файловому менеджері

Я дякую Василя Гусєва за цінні доповнення, які я додав до статті після публікації.

Обговорення завершено.

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.