2012-04-05 225 views
2

我做一些腳本在PowerShell中,我想知道是否有以「聲明」的參數「X」以同樣的方式參數「-Credential」聲明的方式,例如在Get-WMIObject cmdlet中。如何參數類型轉換爲不同的對象類型

讓我更具體。幾乎所有cmdlet中的Credential參數都是PSCredential對象。但是,參數可以是PSCredential對象,也可以是帶有用戶名的字符串對象。

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

傳遞字符串時出現問題。當然,無法對參數進行參數轉換。無法將類型「System.String」轉換爲PSCrendential類型。

回答

5

試試這個:

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

至於參數變量變換,檢查了這真棒腳本:

http://poshcode.org/3024

+0

謝謝Shay Levy。有用! – nbetm 2012-04-09 11:48:43

+0

我一直在函數體內使用if($ Credential.GetType()。Name -ne'PSCredential'){$ Credential = Get-Credential $ Credential}'(將$ Credential轉換爲[PSObject])。您的解決方案更優雅,謝謝!但是,'= [System.Management.Automation.PSCredential] :: Empty'完成了什麼?只是'[System.Management.Automation.Credential()] $ Credential'本身似乎也可以正常工作 - 如果您提供了一個字符串,您將得到一個PS憑據請求提示,其中包含字符串填充的「用戶名」字段。 – 2013-06-06 18:13:01

+0

1/2當Credential參數爲PSCredential時,您無法將字符串傳遞給它: get-something -cred adi,您將得到'無法處理參數轉換'錯誤。使用'Credential()'變換的 解決了這個問題。現在你可以做'get-something -cred adi'並且讓用戶名調用和填充憑證對話框。 – 2013-06-08 10:10:51

0

如果聲明函數參數的類型爲[T],那麼當您調用該函數時,您可以提供任何類型爲[X]的對象,其中[T]具有采用類型[X]的單參數構造函數。

換句話說,如果可以構造從[字符串]一[T]時,可以調用與任一[T]的函數或[字符串]。

0

這是怎麼了我都做到了。我聲明參數是這樣的:

[參數(位置= 2)] [對象] $憑證

然後,在腳本的開頭:

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 
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()),所以在乍一看,它看起來像你指定了兩次憑證類型。當然,實際上這是PowerShell中括號的另一種用法。要指定一個屬性,可以像使用類型一樣使用方括號,但在其中使用括號(即使該屬性不需要任何參數)。

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

相關問題