【问题标题】:Script block error when using rename-item cmdlet使用 rename-item cmdlet 时出现脚本块错误
【发布时间】:2021-04-20 09:41:43
【问题描述】:

执行以下代码后:

$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”,因为它的参数 被指定为脚本块并且没有输入。一个脚本块 没有输入就无法评估。在 line:3 char:14

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

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

【问题讨论】:

  • 如错误所示,您没有将任何输入传送到ren$_ |ren -newname { ...}
  • 不是 ""L$global:n " + $_.name -f $global:n++" 输入吗?我该如何解决?
  • 您使用的数组只有 9 项。如果Get-ChildItem (ls) 找到更多文件怎么办?如果$n 达到10,它也会匹配L1...
  • 不是管道输入。通过在ren 之前添加$_ | 来修复它,正如我之前的评论所示

标签: powershell powershell-3.0


【解决方案1】:

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

封闭管道有,但嵌套管道 (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 个文件,您的脚本可能会开始出现一些潜在的意外行为(尽管您没有明确说明您想要实现的目标,所以也许这就是你想要)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-10-16
    相关资源
    最近更新 更多