You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数的有效值使用。

修正方案

  1. 移除参数的[string]类型约束:让参数接受任意类型,确保转换后的CimSession对象能被完整保留。
  2. 优化转换逻辑(可选):处理输入为数组的情况,适配管道批量输入场景。

修正后的代码

自定义转换属性类(优化后)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:40:23