使用 rename-item cmdlet 时出现脚本块错误

问题描述

执行以下代码后:

$n = 1
$array = "L1","L2","L3","L4","L5","L6","L7","L8","L9"
ls *.pdf | sort lastwritetime | foreach-object {
if ($_.name.substring(0,2) -cnotin $array) {
ren -newname { "L$global:n " + $_.name -f $global:n++ }
} else {
$global:n++
}}
$n = 0

我遇到以下错误

重命名项目:无法评估参数“NewName”,因为它的参数 被指定为脚本块并且没有输入。一个脚本块 没有输入就无法评估。在行:3 字符:14

  • ren -newname { "L$global:n " + $_.name -f $global:n++ }
  •          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : MetadataError: (:) [Rename-Item],ParameterBindingException
    • FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.Renameitemcommand

我哪里出错了?管道具有当前目录中的文件名,但仍表示未收到任何输入。

解决方法

管道具有当前目录中的文件名,但仍表示未收到任何输入。

封闭 管道有,但嵌套管道 (ren -newname { ... }) 没有任何管道输入,因为您从不向它输送任何东西。

更改为:

$n = 1
$array = "L1","L2","L3","L4","L5","L6","L7","L8","L9"
ls *.pdf | sort lastwritetime | foreach-object {
  if ($_.name.substring(0,2) -cnotin $array) {
    $_ |ren -newname { "L{0}{1} " -f $global:n++,$_.name }
  } else {
    $global:n++
  }
}
$n = 0

通过从父管道管道现有项目 ($_),我们知道给 ren/Rename-Item 一些东西将 $_ 绑定到嵌套管道

请注意,作为 Theo mentions,如果目标目录包含 9 个以上的文件,您的脚本可能会开始出现一些潜在的意外行为(尽管您没有明确说明您要实现的目标,所以也许这就是你想要的)