1

我正在寻找解释为什么在使用脚本块而不在管道Rename-Itemcmdlet 中指定命名参数时参数绑定失败的原因。

为什么会这样:

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>]
4

2 回答 2

1

我认为您通过将管道中的名称和同时作为位置参数赋予解析器来混淆解析器。

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

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

于 2015-01-22T00:19:38.300 回答
0

@mjolinor 是对的,您可以使用 Foreach_object (alias %) 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')}
于 2015-01-22T04:43:39.693 回答