如何将参数类型转换为不同的对象类型

时间:2012-04-05 21:27:38

标签: powershell powershell-v2.0

我正在PowerShell中编写一些脚本,我想知道是否有一种方法可以“声明”参数“X”,就像声明参数“-Credential”一样,例如在Get-WMIObject cmdlet中。

让我更具体一点。几乎所有cmdlet中的Credential参数都是PSCredential对象。但是,参数可以是PSCredential Object,也可以是带有用户名的String对象。

[CmdletBinding()]
param ([Parameter(Mandatory = $false)]
       [System.Management.Automation.PSCredential]
       $Credential)

传递字符串时出现问题。当然,不能对参数进行参数变换。无法将类型“System.String”转换为PSCrendential类型。

4 个答案:

答案 0 :(得分:5)

尝试一下:

param(
    [System.Management.Automation.Credential()]
    $Credential=[System.Management.Automation.PSCredential]::Empty
)

关于参数参数转换,请检查这个非常棒的脚本:

http://poshcode.org/3024

答案 1 :(得分:1)

更多信息:)

PowerShell包含其中一个参数转换用于凭证,因此每当您编写具有PSCredential参数的脚本时,您应该使用CredentialAttribute来装饰它,如下所示:

param([Parameter(Mandatory = $false)]
      [System.Management.Automation.PSCredential]
      [System.Management.Automation.Credential()]$Credential =  [System.Management.Automation.PSCredential]::Empty)

那个有点令人困惑,因为你不在属性名称的“属性”部分(即:你不必指定[System.Management.Automation.CredentialAttribute()]),所以乍一看,它看起来你要两次指定Credential类型。当然,实际上这是PowerShell中括号的另一种用法。要指定属性,可以使用方括号和类型,但在括号中使用括号(即使属性不需要任何参数)。

http://huddledmasses.org/more-custom-attributes-for-powershell-parameters/

答案 2 :(得分:0)

如果声明一个函数参数具有类型[T],当你调用该函数时,你可以提供[X]类型的任何对象,其中[T]具有一个类型为[X]的单参数构造函数。

换句话说,如果你可以从[String]构造一个[T],你可以使用[T]或[String]调用该函数。

答案 3 :(得分:0)

我就是这样做的。我声明参数如下:

[参数(位置= 2)] [对象] $ Credential

然后在脚本的开头:

begin {
        Write-Verbose -Message "Starting  $($myinvocation.mycommand)"
        write-verbose -Message "Using volume $($volume.toUpper())"
        #convert credential to a PSCredential if a string was passed.
        if ( $credential -is [system.management.automation.psCredential]) {
            Write-Verbose "Using PSCredential for $($credential.username)"
        }
        ElseIf ($Credential) {
            Write-Verbose "Getting PSCredential for $credential"
            $Credential=Get-Credential $credential
        }
    } #Begin