带脚本块的管道cmdlet上的PowerShell参数绑定

时间:2015-01-21 23:37:21

标签: powershell parameterbinding rename-item-cmdlet

我正在寻找关于在使用脚本块时参数绑定失败而没有在管道Rename-Item cmdlet中指定命名参数的原因的解释。

为什么这样做:

dir file.txt | ren -path {$_.name} -newname {$_.name -replace 'txt','doc'}

工作:

dir file.txt | ren {$_.name} {$_.name -replace 'txt','doc'}

错误:

Rename-Item : A positional parameter cannot be found that accepts argument '$_.name'.
At line:1 char:19
+ dir file.txt | ren <<<<  {$_.name} {$_.name -replace 'txt','doc'}
    + CategoryInfo          : InvalidArgument: (:) [Rename-Item], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RenameItemCommand

Rename-Item语法对我来说非常简单(即两个强制位置参数):

SYNTAX
    Rename-Item [-Path] <string> [-NewName] <string> [-Credential <PSCredential>] [-Force] [-PassThru] [-Confirm] [-WhatIf] [-UseTransaction] [<CommonParameters>]

2 个答案:

答案 0 :(得分:1)

我认为您通过从管道中提供名称并同时作为位置参数来混淆解析器。

cmdlet将接受管道中的名称或作为位置或命名参数。由于您将输入输入到cmdlet中,因此假设它是要使用的名称。如果名称来自管道,那么应该只有一个额外的位置参数(Newname)。给出管道输入和两个位置参数,它不确定在哪里绑定。

使用命名参数可以明确指示如何绑定参数。

答案 1 :(得分:0)

@mjolinor是对的,你可以使用Foreach_object(别名%)来做你的建议CmdLet:

dir file.txt | ForEach-Object {ren -path $_.name -newname ($_.name -replace 'txt','doc')}

dir file.txt | % {ren -path $_.name -newname ($_.name -replace 'txt','doc')}