Как включить переменную в -Newname в powershell - PullRequest
1 голос
/ 30 июня 2019

С помощью скрипта power-shell, пытающегося добавить переменную $ Album в последовательность имен.

Пробовал писать хост, переменная работает. Пробовал такие вещи, как () [] {} "" ''. ЭСТ.

Цель состоит в том, чтобы $Album работал в этой строке ниже: {0:D2}$Album.mxf

$i = 1

    $Artist = " Name"
    $Type = "Type"
    $Location = "Loc"
    $Month = "Month"
    $Year = "2019"
    $Album = "$Artist $Type $Location $Month $Year"

# Write-Host -ForegroundColor Green -Object $Album;

Get-ChildItem *.mxf | %{Rename-Item $_ -NewName ('{0:D2}$Album.mxf' -f $i++)}

До:

  • Разное название - 1.mxf
  • Разное название - 4.mxf
  • Разное название - 6.mxf

Ток:

  • 01 $ Album.mxf
  • 02 $ Album.mxf
  • 03 $ Album.mxf

Цель:

  • 01 Имя Тип Местонахождение Месяц 2019.mxf
  • 02 Имя Тип Местонахождение Месяц 2019.mxf
  • 03 Имя Тип Местонахождение Месяц 2019.mxf

Ответы [ 3 ]

1 голос
/ 30 июня 2019

Или вот так (работает как в интерактивном сеансе, так и в скрипте). И вам нужен пробел перед $album.

Get-ChildItem *.mxf | Rename-Item -NewName { "{0:D2} $Album.mxf" -f $script:i++ }

РЕДАКТИРОВАТЬ: Есть другой способ. Малоизвестно, что foreach-объект может занимать 3 блока скрипта (начало / процесс / конец). -process может принимать массив блоков скриптов, как описано в документации. Вы всегда можете проверить это с -whatif.

Get-ChildItem *.mxf | 
foreach { $i = 1 } { Rename-Item $_ -NewName ("{0:D2} $Album.mxf" -f $i++) -whatif }  
1 голос
/ 30 июня 2019

Ваш собственный ответ эффективен, но неудобен в двух отношениях:

  • Смешивает расширяемые строки (интерполяция строк внутри "...") с форматированием строк на основе шаблона с помощью оператора -f.

  • Используется % (ForEach-Object) для запуска Rename-Item для каждого входного объекта, что весьма неэффективно.

Вот решение, которое обеспечивает исправление путем последовательного использования -f и использования блока сценария с задержкой привязки :

$Artist = " Name"
$Type = "Type"
$Location = "Loc"
$Month = "Month"
$Year = "2019"
$Album = "$Artist $Type $Location $Month $Year"

$i = 1
Get-ChildItem *.mxf |
  Rename-Item -NewName { '{0:D2} {1}.mxf' -f ([ref] $i).Value++, $Album }

Обратите внимание на использование ([ref] $i).Value++ для увеличения значения $i, что необходимо, поскольку блок сценария с задержкой привязки, переданный в -NewName, выполняется в дочерней области - см. этот ответ для деталей.

Обратите внимание, что $script:i++ - прагматичная альтернатива, но менее гибкая, чем решение выше - см. Связанный ответ.

0 голосов
/ 30 июня 2019

Ответ @ Тео в комментарии

  • Используйте здесь двойные кавычки "{0:D2}$Album.mxf", чтобы раскрыть переменную $ Album.
$i = 1

    $Artist = " Name"
    $Type = "Type"
    $Location = "Loc"
    $Month = "Month"
    $Year = "2019"
    $Album = "$Artist $Type $Location $Month $Year"

# Write-Host -ForegroundColor Green -Object $Album;

Get-ChildItem *.mxf | %{Rename-Item $_ -NewName ("{0:D2}$Album.mxf" -f $i++)}

До:

  • Разное название - 1.mxf
  • Разное название - 4.mxf
  • Разное название - 6.mxf

После того, как:

  • 01 Имя Тип Местонахождение Месяц 2019.mxf
  • 02 Имя Тип Местонахождение Месяц 2019.mxf
  • 03 Имя Тип Местонахождение Месяц 2019.mxf
...