user7811302
user7811302

Reputation:

How to include variable in -Newname in powershell

Via power-shell script, trying to add $Album variable to naming sequence.

Tried write host, variable is working. Have tried things like () [] {} "" '' . ect.

The goal is to get $Album to work in this line below: {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++)}

Before:

Current:

Goal:

Upvotes: 1

Views: 645

Answers (3)

js2010
js2010

Reputation: 27408

Or like this (works both in an interactive session and in a script). And you want a space before $album.

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

EDIT: There is another way. It is little known that foreach-object can take 3 script blocks (begin/process/end). -process can take a script block array as documented. You can always test these things with -whatif.

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

Upvotes: 0

mklement0
mklement0

Reputation: 437042

Your own answer is effective, but it is awkward in two respects:

  • It mixes expandable strings (string interpolation inside "...") with template-based string formatting via the -f operator.

  • It uses % (ForEach-Object) to launch Rename-Item for every input object, which is quite inefficient.

Here's a solution that provides a remedy, by using -f consistently and by using a delay-bind script block:

$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 }

Note the use of ([ref] $i).Value++ to increment the value of $i, which is necessary, because the delay-bind script block passed to -NewName runs in a child scope - see this answer for details.

Note that $script:i++ is a pragmatic alternative, but less flexible than the solution above - see the linked answer.

Upvotes: 0

user7811302
user7811302

Reputation:

Answered by @Theo in comment

  • Use double-quotes here "{0:D2}$Album.mxf" so the variable $Album gets expanded.
$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++)}

Before:

  • Misc name - 1.mxf
  • Misc name - 4.mxf
  • Misc name - 6.mxf

After:

  • 01 Name Type Loc Month 2019.mxf
  • 02 Name Type Loc Month 2019.mxf
  • 03 Name Type Loc Month 2019.mxf

Upvotes: 0

Related Questions