【问题标题】:How to convert parameter type into a different object type如何将参数类型转换为不同的对象类型
【发布时间】:2012-04-05 21:27:37
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: powershell powershell-2.0


    【解决方案1】:

    试试这个:

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

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

    http://poshcode.org/3024

    【讨论】:

    • 我一直在函数体中使用if ($Credential.GetType().Name -ne 'PSCredential') {$Credential = Get-Credential $Credential}(将$Credential 转换为[PSObject])。您的解决方案更优雅,谢谢!但是,=[System.Management.Automation.PSCredential]::Empty 完成了什么?仅[System.Management.Automation.Credential()]$Credential 本身似乎也可以正常工作 - 如果您提供一个字符串,您会收到一个 PS 凭据请求提示,其中“用户名”字段填充了该字符串。
    • 1/2 当 Credential 参数为 PSCredential 时,您无法向其传递字符串:get-something -cred adi,您将收到“无法处理参数转换”错误。使用“Credential()”转换解决了这个问题。现在您可以执行“get-something -cred adi”并调用凭据对话框并使用用户名填充。
    • 2/2 我发现将 valye 设置为 [PSCredential]::Empty 时的一种用途是将凭证传递给使用 wmi cmdlet 的函数。 WMI 不允许“用户凭据不能用于本地连接”,因此您必须在函数内执行 IF,查找凭据是否已通过并且本地计算机是目标。使用 [PSCredential]::Empty,您只需传递 $credential 并摆脱它。希望这已经足够清楚了。
    • 仅供参考:PoshCode 链接似乎已损坏...这是一个关于自动转换如何工作的有用列表:devblogs.microsoft.com/powershell/…
    【解决方案2】:

    更多信息:)

    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/

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-08-11
          • 2019-08-04
          • 2017-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-25
          • 1970-01-01
          相关资源
          最近更新 更多