ArgumentTransformationAttribute的Transform方法是否返回对象?代码求助
问题:ArgumentTransformationAttribute的Transform方法未返回可用CimSession对象
请问ArgumentTransformationAttribute的Transform方法是否会返回对象?我编写了一段将计算机名转换为CimSession类型的自定义属性类代码,并编写了测试函数Get-ADComputerDescription,但测试时Transform方法未返回可用对象,仅返回无法使用的拆分信息,请问我哪里操作有误?
自定义转换属性类代码:
using namespace System.Management.Automation ; using namespace System.Net.NetworkInformation ; using namespace Microsoft.Management.Infrastructure ; enum Protocol { WsMan Dcom } class ComputernameTransformationAttribute : ArgumentTransformationAttribute { <# ValidateComputername #> hidden [CimSession] NewCimsession([string] $inputData){ $Protocol = [Protocol]::WsMan -as [string] ; $CimSessionOption = New-CimSessionOption -Protocol $Protocol ; # [CimSession] $Cimsession = New-CimSession @Param [CimSession] $Cimsession = [CimSession]::Create($inputData, $CimSessionOption); return $CimSession; } # Transform() method is called whenever there is a variable or parameter assignment. [System.Object] Transform( [EngineIntrinsics]$engineIntrinsics, [System.Object]$inputData ){ return $($this.NewCimsession($inputData)); } }
测试函数代码:
function Get-ADComputerDescription { [CmdletBinding()] #[OutputType([GKMAdinfo])] param ( # ComputerName [Parameter(ValueFromPipeline)] # [ValidateNotNullOrEmpty()] [Alias("CN","Machine","Name")] [ComputernameTransformation()] [string]$ComputerName ) $ComputerName Get-CimInstance Win32_ComputerSystem -CimSession $ComputerName }
问题分析与解决
核心错误原因
参数$ComputerName被声明为[string]类型,导致Transform方法返回的CimSession对象被PowerShell自动强制转换为字符串(即CimSession对象的ToString()结果),而非保留原对象类型,所以后续无法将其作为-CimSession参数的有效值使用。
修正方案
- 移除参数的
[string]类型约束:让参数接受任意类型,确保转换后的CimSession对象能被完整保留。 - 优化转换逻辑(可选):处理输入为数组的情况,适配管道批量输入场景。
修正后的代码
自定义转换属性类(优化后)
using namespace System.Management.Automation ; using namespace System.Net.NetworkInformation ; using namespace Microsoft.Management.Infrastructure ; enum Protocol { WsMan Dcom } class ComputernameTransformationAttribute : ArgumentTransformationAttribute { hidden [CimSession] NewCimsession([string] $inputData){ $Protocol = [Protocol]::WsMan -as [string] ; $CimSessionOption = New-CimSessionOption -Protocol $Protocol ; [CimSession] $Cimsession = [CimSession]::Create($inputData, $CimSessionOption); return $CimSession; } [System.Object] Transform( [EngineIntrinsics]$engineIntrinsics, [System.Object]$inputData ){ # 处理数组输入(如管道批量传值) if ($inputData -is [array]) { return $inputData | ForEach-Object { $this.NewCimsession($_.ToString()) } } return $this.NewCimsession($inputData.ToString()) } }
修正后的测试函数
function Get-ADComputerDescription { [CmdletBinding()] param ( [Parameter(ValueFromPipeline)] [Alias("CN","Machine","Name")] [ComputernameTransformation()] # 移除[string]类型约束,保留转换后的CimSession对象 $ComputerName ) # 直接使用CimSession对象调用Get-CimInstance Get-CimInstance Win32_ComputerSystem -CimSession $ComputerName }
额外说明
ArgumentTransformationAttribute的Transform方法确实可以返回任意对象类型,只要参数没有被更严格的类型约束覆盖。如果需要限制输入为字符串,可以在Transform方法中添加输入验证逻辑,避免非法类型输入导致转换失败。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

