2

私はいくつかの PowerShell コードに取り組んでおり、可能な限り読みやすくしようとしています (PowerShell が非常に優れているものです)。Add-Member 関数と Get-Member 関数がありますが、関連する Set-Member 関数はありません。そこで、プロジェクト用に作成することにしました。ただし、関数自体では (以下に示すように)、次の行を使用する必要があります。

$_.$NotePropertyName = $NotePropertyValue

仕事に。ただし、次の行を使用する必要があると思いますが、機能しません。

$InputObject.$NotePropertyName = $NotePropertyValue

なぜこのように反応するのでしょうか?

Function Set-Member
{
    [CmdletBinding(DefaultParameterSetName='Message')]
    param(
        [Parameter(ParameterSetName='Message', Position=0,  ValueFromPipeline=$true)] [object[]]$InputObject,
        [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyName,
        [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyValue
    )
    $strInitialValue = $InputObject.($NotePropertyName)  # Get the value of the property FirstName
                                                         # for the current object in the pipe
    $_.$NotePropertyName = $NotePropertyValue
}


$objTest = [PSCustomObject]@ {
    FirstName = "Bob"
    LastName = "White"
}

$objTest | ForEach-Object {
    $_ | Set-Member -NotePropertyName "FirstName" -NotePropertyValue "Joe"
    $_      # Push the object back out the pipe
}

$objTest | ForEach-Object {
    $_ | Set-Member -NotePropertyName "FirstName" -NotePropertyValue "Bobby$($_.FirstName)"
    $_      # Push the object back out the pipe
}
4

1 に答える 1

4

$InputObject パラメーターをオブジェクトの配列として定義しました。for配列を反復処理し、単一のオブジェクトとして扱わないようにするには、関数にループを含める必要があります。または、タイプを[object]ではなく に変更し[object[]]ます。

パイプラインを使用して関数を呼び出すため、関数のプロセス ブロックを使用する必要があります。そうしないと、パイプラインで処理された最後の項目のみが表示されます。

Function Set-Member
{
    [CmdletBinding(DefaultParameterSetName='Message')]
    param(
        [Parameter(ParameterSetName='Message', Position=0,  ValueFromPipeline=$true)] [object[]]$InputObject,
        [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyName,
        [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyValue
    )
    process
    {
        foreach ($obj in $InputObject)
        {
            $strInitialValue = $obj.($NotePropertyName)  # Get the value of the property FirstName
                                                         # for the current object in the pipe
            $obj.$NotePropertyName = $NotePropertyValue
        }
    }
}
于 2013-05-15T19:02:29.550 に答える