Переименование файлов powershell

Работа с файлами и папками – PowerShell

Переименование файлов powershell
sh: 1: –format=html: not found

  • 06/05/2017
  • Чтение занимает 3 мин
    • j
    • o

Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисках Windows.

Navigating through Windows PowerShell drives and manipulating the items on them is similar to manipulating files and folders on Windows physical disk drives. В этой статье описывается выполнение конкретных задач по управлению файлами и папками с помощью PowerShell.

This article discusses how to deal with specific file and folder manipulation tasks using PowerShell.

Получение списка файлов и папок, содержащихся в папкеListing All the Files and Folders Within a Folder

Извлечь все элементы непосредственно из папки можно с помощью командлета Get-ChildItem.You can get all items directly within a folder by using Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force .

Add the optional Force parameter to display hidden or system items.

Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):For example, this command displays the direct contents of Windows PowerShell Drive C (which is the same as the Windows physical drive C):

Get-ChildItem -Path C:\ -ForceЭта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe или команда ls оболочки UNIX.The command lists only the directly contained items, much using Cmd.exe's DIR command or ls in a UNIX shell.

Для показа вложенных элементов необходимо также указать параметр -Recurse.In order to show contained items, you need to specify the -Recurse parameter as well. (Время выполнения этой операции будет очень велико.

) Для вывода всего содержимого диска C введите:(This can take an extremely long time to complete.) To list everything on the C drive:

Get-ChildItem -Path C:\ -Force -Recurse

Командлет Get-ChildItem позволяет отфильтровать элементы с помощью параметров Path , Filter , Include и Exclude , но обычно осуществляется лишь фильтрация по имени.

Get-ChildItem can filter items with its Path , Filter , Include , and Exclude parameters, but those are typically ly on name. Сложную фильтрацию на основе других свойств элементов можно выполнить с помощью Where-Object.

You can perform complex filtering other properties of items by using Where-Object.

Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г.

и размер которых не менее одного мегабайта и не более десяти мегабайт:The following command finds all executables within the Program Files folder that were last modified after October 1, 2005 and which are neither smaller than 1 megabyte nor larger than 10 megabytes:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)}

Копирование выполняется с помощью командлета Copy-Item.Copying is done with Copy-Item. Следующая команда создает резервную копию C:\boot.ini в C:\boot.bak:The following command backs up C:\boot.ini to C:\boot.bak:

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak

Если целевой файл уже существует, то попытка копирования завершается неудачей.If the destination file already exists, the copy attempt fails. Чтобы перезаписать имеющийся целевой файл, используйте параметр Force .To overwrite a pre-existing destination, use the Force parameter:

Copy-Item -Path C:\boot.ini -Destination C:\boot.bak -Force Эта команда работает, даже если целевой объект доступен только для чтения.This command works even when the destination is read-only.

Так же выполняется и копирование папок.Folder copying works the same way. Эта команда копирует папку C:\temp\test1 в новую папку C:\temp\DeleteMe рекурсивно.This command copies the folder C:\temp\test1 to the new folder C:\temp\DeleteMe recursively:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Можно также скопировать избранные элементы.You can also copy a selection of items. Следующая команда копирует все файлы TXT, содержащиеся в папке C:\data, в папку C:\temp\text:The following command copies all .txt files contained anywhere in C:\data to C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Для копирования элементов файловой системы можно использовать и другие средства.You can still use other tools to perform file system copies. В Windows PowerShell по-прежнему работают команды XCOPY, ROBOCOPY и такие COM-объекты, как Scripting.FileSystemObject .XCOPY, ROBOCOPY, and COM objects, such as the Scripting.

FileSystemObject, all work in Windows PowerShell. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии файла C:\boot.ini в файле C:\boot.bak:For example, you can use the Windows Script Host Scripting.FileSystem COM class to back up C:\boot.

ini to C:\boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile('C:\boot.ini', 'C:\boot.bak')

Создание файлов и папокCreating Files and Folders

Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell.Creating new items works the same on all Windows PowerShell providers.

Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.

If a Windows PowerShell provider has more than one type of item—for example, the FileSystem Windows PowerShell provider distinguishes between directories and files—you need to specify the item type.

Эта команда создает папку C:\tempew Folder:This command creates a new folder C:\tempew Folder:
New-Item -Path 'C:\tempew Folder' -ItemType Directory

Эта команда создает пустой файл C:\tempew Folder\file.txt.This command creates a new empty file C:\tempew Folder\file.txt

New-Item -Path 'C:\tempew Folder\file.txt' -ItemType File

Важно!

При использовании параметра Force с командой New-Item для создания папки, которая уже существует, она не перезапишет и не заменит папку.

When using the Force switch with the New-Item command to create a folder, and the folder already exists, it won't overwrite or replace the folder. Будет просто возвращен имеющийся объект папки.It will simply return the existing folder object.

Однако, если использовать New-Item -Force в уже имеющимся файле, файл будет полностью перезаписан.However, if you use New-Item -Force on a file that already exists, the file will be completely overwritten.

Удаление всех файлов и папок, содержащихся в папкеRemoving All Files and Folders Within a Folder

Удалить вложенные элементы можно с помощью командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит.You can remove contained items using Remove-Item, but you will be prompted to confirm the removal if the item contains anything else.

Например, при попытке удаления папки C:\temp\DeleteMe, которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:For example, if you attempt to delete the folder C:\temp\DeleteMe that contains other items, Windows PowerShell prompts you for confirmation before deleting the folder:

Remove-Item -Path C:\temp\DeleteMe ConfirmThe item at C:\temp\DeleteMe has children and the Recurse parameter was notspecified. If you continue, all children will be removed with the item. Are yousure you want to continue?[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help(default is “Y”):

Если подтверждение для каждого вложенного элемента нежелательно, задайте параметр Recurse :If you do not want to be prompted for each contained item, specify the Recurse parameter:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Подключение локальной папки как дискаMapping a Local Folder as a drive

Отобразить локальную папку можно с помощью команды New-PSDrive.You can also map a local folder, using the New-PSDrive command.

Следующая команда создает локальный диск P:, корневым каталогом которого является локальный каталог Program Files, отображающийся только в сеансе PowerShell:The following command creates a local drive P: rooted in the local Program Files directory, visible only from the PowerShell session:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Как и при использовании сетевых дисков, диски, отображенные в Windows PowerShell, немедленно становятся доступными оболочке Windows PowerShell.Just as with network drives, drives mapped within Windows PowerShell are immediately visible to the Windows PowerShell shell.

Чтобы создать подключенный диск, отображающийся в проводнике, нужен параметр -Persist.In order to create a mapped drive visible from File Explorer, the parameter -Persist is needed. Но с этим параметром можно использовать только удаленные пути.

However, only remote paths can be used with Persist.

Чтение текстового файла в массивReading a Text File into an Array

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

One of the more common storage formats for text data is in a file with separate lines treated as distinct data elements.

Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:The Get-Content cmdlet can be used to read an entire file in one step, as shown here:

PS> Get-Content -Path C:\boot.ini[boot loader]timeout=5default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=AlwaysOff /fastdetectmulti(0)disk(0)rdisk(0)partition(1)\WINDOWS=” Microsoft Windows XP Professionalwith Data Execution Prevention” /noexecute=optin /fastdetect

Командлет Get-Content сразу рассматривает данные, считанные из файла, как массив с одним элементом на строку содержимого файла.

Get-Content already treats the data read from the file as an array, with one element per line of file content.

Убедиться в этом можно, проверив свойство Length полученного содержимого:You can confirm this by checking the Length of the returned content:

PS> (Get-Content -Path C:\boot.ini).Length6

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков.This command is most useful for getting lists of information into Windows PowerShell directly. Например, можно хранить в файле C:\temp\domainMembers.txt список имен компьютеров или IP-адресов по одному имени на каждую строку файла.

For example, you might store a list of computer names or IP addresses in a file C:\temp\domainMembers.txt, with one name on each line of the file.

Вы можете использовать командлет Get-Content, чтобы извлечь содержимое файла и поместить его в переменную $Computers:You can use Get-Content to retrieve the file contents and put them in the variable $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.$Computers is now an array containing a computer name in each element.

Источник: https://docs.microsoft.com/ru-ru/powershell/scripting/samples/working-with-files-and-folders?view=powershell-7.1&viewFallbackFrom=powershell-6

Как массово переименовать файлы по маске в PowerShell

Переименование файлов powershell

Невинный пост в группе ВК о сочетании клавиш проводника 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” чревато нежелательным переименованием, например, файла winzip-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.

Источник: http://www.outsidethebox.ms/17857/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.