Я пытался переименовать каждый текстовый файл в папке с именем $New-Guid
.txt, чтобы все они имели уникальные имена.
Кто-нибудь знает простой способ сделать это?
tl; dr
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
Обратите внимание на использование блока сценария ({ ... }
) и вызов New-Guid
внутри $(...)
, встроенного в расширяемая строка ("..."
).
Операции переименования / перемещения файлов с входными файлами несколько наиболее эффективно выполняются с Блоки скрипта задержка привязки, где блок сценария ({ ... }
), переданный параметру -NewName
/ -Destination
, вычисляет новое имя / имя и / или местоположение для каждого входного файла, что позволяет указать новое имя файла:
Следующее обсуждает только 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 ++(Get-Variable -Scope 1 index).Value, $_.Name }
Примечание. Увеличение $index
через ++(Get-Variable -Scope 1 $index).Value
, а не просто ++$index
необходимо, потому что блоки сценария привязки задержки выполняются в области видимости переменной ребенок, где ++$index
неявно создает переменную местный$index
, которая выходит за пределы области действия после каждого вызова - для более подробного объяснения, см. этот ответ.
... | Rename-Item -NewName {(New-Guid).Guid + '.txt'}