为何在PowerShell中为字符串对象添加Reverse ScriptMethod后方法未生成?
问题原因与解决方法
核心原因
PowerShell中的[string]是.NET值类型,通过管道传递对象时会创建原对象的副本。你用管道把$s传给Add-Member,实际修改的是这个副本,原变量$s完全没被改动,所以看不到新增的Reverse方法。
两种解决方式
使用
-PassThru参数接收修改后的对象
让Add-Member返回修改后的副本,重新赋值给原变量:$s = "hi world" $sb = { $a = [char[]] $this [array]::Reverse($a) -join $a } $s = $s | Add-Member -MemberType ScriptMethod -Name Reverse -Value $sb -PassThru执行后调用
$s.Reverse()就能得到反转后的字符串。直接用
-InputObject参数指定目标对象
跳过管道,直接把原对象传递给Add-Member,避免副本创建:$s = "hi world" $sb = { $a = [char[]] $this [array]::Reverse($a) -join $a } Add-Member -InputObject $s -MemberType ScriptMethod -Name Reverse -Value $sb
额外说明
值类型(如string、int)在PowerShell中默认按值传递,所有针对副本的修改不会影响原变量。如果是引用类型(如自定义对象、哈希表),管道传递的是引用,原对象会直接被修改,就不会出现这个问题。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

