Powershell / .Net:获取对方法返回的对象的引用
Posted
技术标签:
【中文标题】Powershell / .Net:获取对方法返回的对象的引用【英文标题】:Powershell / .Net: Get a reference to an object returned by a method 【发布时间】:2011-02-22 17:50:33 【问题描述】:我正在通过编写一个简单的解析器自学 PowerShell。我使用 .Net 框架类Collections.Stack
。我想修改堆栈顶部的对象。
我知道我可以 pop()
关闭对象,修改它,然后 push()
重新打开它,但这让我觉得不雅。
首先,我尝试了这个:
$stk = new-object Collections.Stack
$stk.push( (,'My first value') )
( $stk.peek() ) += ,'| My second value'
这引发了错误:
Assignment failed because [System.Collections.Stack] doesn't contain a settable property 'peek()'.
At C:\Development\***\PowerShell-Stacks\test.ps1:3 char:12
+ ( $stk.peek <<<< () ) += ,'| My second value'
+ CategoryInfo : InvalidOperation: (peek:String) [], RuntimeException
+ FullyQualifiedErrorId : ParameterizedPropertyAssignmentFailed
接下来我尝试了这个:
$ary = $stk.peek()
$ary += ,'| My second value'
write-host "Array is: $ary"
write-host "Stack top is: $($stk.peek())"
阻止了错误但仍然没有做正确的事情:
Array is: My first value | My second value
Stack top is: My first value
显然,分配给 $ary 的是堆栈顶部对象的 副本,所以当我在 $ary 中的对象时,堆栈顶部的对象仍然存在不变。
最后,我阅读了 [ref] 类型,并尝试了这个:
$ary_ref = [ref]$stk.peek()
$ary_ref.value += ,'| My second value'
write-host "Referenced array is: $($ary_ref.value)"
write-host "Stack top is still: $($stk.peek())"
但还是没有骰子:
Referenced array is: My first value | My second value
Stack top is still: My first value
我假设peek()
方法返回对实际对象的引用,而不是克隆。如果是这样,那么引用似乎被 PowerShell 的表达式处理逻辑的克隆替换。
谁能告诉我是否有办法做我想做的事?还是我必须恢复到pop()
/修改/push()
?
【问题讨论】:
【参考方案1】:数组始终具有固定大小。当您将项目添加到数组时,会创建一个长度增加的新数组,并将旧数组复制到新数组中。引用已隐式更改,因此您拥有一个包含 2 个元素的全新数组,而堆栈仍包含旧数组。请改用列表。
【讨论】:
【参考方案2】:我想通了。创建副本的是“+=”运算符。您似乎无法将元素添加到 .Net 数组。如果我使用不同类型的对象,例如哈希表,我可以轻松添加元素:
$stk.push( @"1"="My first value" )
$stk.peek()["2"]="| My second value"
write-host "Stack top keys: $($stk.peek().keys)"
write-host "Stack top values: $($stk.peek().values)"
产量
Stack top keys: 1 2
Stack top values: My first value | My second value
或者对于更类似于数组的对象,Collections.ArrayList 有效
$item = new-object Collections.ArrayList
$stk.push( $item )
$stk.peek().Add( "My first value" )
$stk.peek().Add( "| My second value" )
$obj = $stk.peek()
$obj.Add( "| My third value" )
write-host "Stack top is: $($stk.peek())"
哪些输出
Stack top is: My first value | My second value | My third value
【讨论】:
以上是关于Powershell / .Net:获取对方法返回的对象的引用的主要内容,如果未能解决你的问题,请参考以下文章
PowerShell 脚本返回机器上的 .NET Framework 版本?
powershell net view 未显示网络上的所有计算机名称
如何使用 PowerShell 和 SQLCMD 获取存储过程返回值?