如何在powershell中的-Newname中包含变量

How to include variable in -Newname in powershell

通过 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++)}

之前:

当前:

目标:

@Theo 在评论中回答

  • 在此处使用 double-quotes "{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 姓名类型 Loc 月份 2019.mxf
  • 02 姓名类型 Loc 月份 2019.mxf
  • 03 姓名类型 Loc 月份 2019.mxf

或者像这样(在交互式会话和脚本中都有效)。你想要 space 在 $album.

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

编辑:还有另一种方法。鲜为人知的是 foreach-object 可以占用 3 个脚本块 (begin/process/end)。 -process 可以采用记录的脚本块数组。你总是可以用 -whatif.

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

有效,但有两点尴尬:

  • 它混合了可扩展字符串"..."内的字符串插值)和template-based字符串格式 通过 -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 的 delay-bind 脚本块在 子作用域 - 有关详细信息,请参阅

请注意,$script:i++ 是一种实用的替代方案,但不如上面的解决方案灵活 - 请参阅链接的答案。