【问题标题】:PowerShell parameter binding on piped cmdlets with script blocks带有脚本块的管道 cmdlet 上的 PowerShell 参数绑定
【发布时间】:2015-03-20 15:53:43
【问题描述】:

我正在寻找有关在使用脚本块时参数绑定失败的原因,而无需在管道 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>]

【问题讨论】:

    标签: powershell parameterbinding rename-item-cmdlet


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      @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')}
      

      【讨论】:

        猜你喜欢
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多