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
переменную - для более подробного объяснения см. этот ответ .