我正在寻找关于在使用脚本块时参数绑定失败而没有在管道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>]
答案 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')}