Переименуйте каждый файл с помощью new-guid в powershell

Я пытался переименовать каждый текстовый файл в папке с именем файла $New-Guid.txt, поэтому все они должны иметь уникальные имена.

Кто-нибудь знает простой способ сделать это?

1 ответ

ТЛ; др

Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }

Обратите внимание на использование блока скрипта ({ ... }) и призыв к New-Guid внутри $(...) встроен в расширяемую строку ( "..." )


Операции переименования / перемещения файлов с несколькими входными файлами наиболее эффективно выполняются с блоками сценария с задержкой привязки, где блок сценария ({ ... }) перешел к -NewName / -Destination Параметр вычисляет новое имя / имя и / или местоположение для каждого входного файла, что позволяет указать новое имя файла:

  • как преобразование входного имени файла
  • и / или как автоматически сгенерированное имя файла на основе, например, порядкового номера или, как в вашем случае, GUID.

Следующее обсуждает только Rename-Item -NewName, но это относится аналогично Move-Item -Destination, но обратите внимание на важное отличие:

  • -NewName за Rename-Item задает новое имя для каждого элемента ввода в его текущем местоположении, где бы оно ни находилось.

  • -Destination за Move-Item задает новый путь для каждого элемента ввода и указывает относительный путь, включая простое имя файла, относительно местоположения вызывающего, независимо от того, где расположены входные файлы.

Общий шаблон:

Get-ChildItem ... | Rename-Item -NewName { ... }

Обратите внимание, что входные файлы могут быть альтернативно определены через Get-Item, как строки пути, или как объекты с .Path имущество.


Пример трансформации:

Допустим, вы хотите переименовать все *.txt файлы в текущем каталоге, добавляя к их именам префикс foo-,

Внутри блока скрипта { ... } автоматическая переменная $_ относится к входному объекту под рукой, как обычно в PowerShell.
С вводом файла из Get-ChildItem, $_ это экземпляр класса [System.IO.FileInfo], позволяя вам получить доступ к его .Name свойство, чтобы получить имя файла.

Get-ChildItem *.txt | Rename-Item -NewName { 'foo-' + $_.Name }

Пример автогенерации с порядковым номером:

Допустим, вы хотите переименовать все *.txt файлы в текущем каталоге, добавляя к их именам двухзначный порядковый номер, начинающийся с 1, а затем - например, 01-,

$index = 0
Get-ChildItem *.txt |
  Rename-Item -NewName { '{0:00}-{1}' -f ++([ref] $index).Value, $_.Name }

Примечание: увеличение $index с помощью ++([ref] $index).Value а не просто ++$index необходимо, потому что блоки сценария delay-bind выполняются в области дочерних переменных, где ++$index будет неявно создать местный $index переменная - для более подробного объяснения смотрите этот ответ.

Другие вопросы по тегам