如何将参数类型转换为其他对象类型



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

让我更具体一点。几乎所有 cmdlet 中的凭据参数都是 PSCredential 对象。但是,参数可以是 PSCredential 对象,也可以是带有用户名的字符串对象。

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

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

试一试:

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

至于参数参数转换,请检查这个很棒的脚本:

http://poshcode.org/3024

更多信息:)

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()]),因此乍一看,您似乎指定了两次凭据类型。当然,实际上这是PowerShell中括号的另一种用法。若要指定属性,请使用与类型一样的方括号,但在其中使用括号(即使属性不需要任何参数)。

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

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

换句话说,如果可以从 [字符串] 构造 [T],则可以使用 [T] 或 [String] 调用该函数。

这就是我的做法。我像这样声明参数:

[参数(位置=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

最新更新