我一直在研究一些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
}
答案 0 :(得分:3)
您将$ InputObject参数定义为对象数组。您应该在函数中使用for
循环来迭代数组,而不是将其视为单个对象。或者将类型更改为[object]
而不是[object[]]
。
由于您使用管道来调用该函数,您应该使用process block of the function,否则您只会看到管道中的最后一项。
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
}
}
}