1

Rename-Itemパイプコマンドレットで名前付きパラメーターを指定せずにスクリプト ブロックを使用すると、パラメーター バインディングが失敗する理由についての説明を探しています。

なぜこれが機能するのですか:

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私には非常に簡単に思えます (つまり、2 つの必須の位置パラメーター)。

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

2 に答える 2

1

パーサーにパイプからの名前と位置パラメーターを同時に与えることで、パーサーを混乱させていると思います。

コマンドレットは、パイプラインから、または位置パラメーターまたは名前付きパラメーターとして名前を受け入れます。入力をコマンドレットにパイプしているため、それが使用する名前であると想定されています。名前がパイプラインから取得されている場合、追加の位置パラメーター (Newname) は 1 つだけである必要があります。パイプライン入力と 2 つの位置パラメーターの両方を指定すると、何をどこにバインドするかわかりません。

名前付きパラメーターを使用すると、パラメーターをバインドする方法について明示的な指示が与えられます。

于 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 に答える