переименуйте каждый файл с помощью new-guid в powershell - PullRequest
0 голосов
/ 01 декабря 2018

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

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

1 Ответ

0 голосов
/ 02 декабря 2018

tl; dr

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

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


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

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

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

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

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

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

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

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


Преобразование пример :

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

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

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, поскольку блоки сценариев с задержкой привязки выполняются в переменной области child , где ++$index будетнеявно создайте локальную $index переменную - для более подробного объяснения см. этот ответ .

...