Переименуйте каждый файл с помощью 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
переменная - для более подробного объяснения смотрите этот ответ.