2014-02-19 85 views
2

說我有一個PowerShell腳本TestParameters.ps1這樣的,有兩個強制性的,命名參數和兩個可選參數:顯示所有PowerShell腳本參數默認變量

[CmdletBinding()] 
Param (
[Parameter(Mandatory=$True)] 
[string] $AFile = "C:\A\Path", 

[Parameter(Mandatory=$True)] 
[ValidateSet("A","B","C", "D")] 
[string] $ALetter = "A", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional1 = "Foo", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional2 = "Bar" 
) 

echo "Hello World!" 
$psboundparameters.keys | ForEach { 
    Write-Output "($_)=($($PSBoundParameters.$_))" 
} 

說我調用腳本是這樣的:

.\TestParameters.ps1 ` 
    -AFile     "C:\Another\Path" ` 
    -ALetter    "B" 

產生輸出:

Hello World! 
(AFile)=(C:\Another\Path) 
(ALetter)=(B) 

Powershell的設置variab les $ Optional1和$ Optional2 ...但我如何輕鬆地將它們顯示在屏幕上,就像我使用$ PSBoundParameters的方式一樣?

想簡單地寫每次我有一個腳本時間如下:

Write-Host $AFile 
Write-Host $ALetter 
Write-Host $Optional1 
Write-Host $Optional2 

注:

  • 的$ args似乎只包括未綁定的參數,而不是默認 參數
  • $ MyInvocation似乎只包括在命令行上傳遞的命令 編輯:MyInvocation讓我mber變量MyCommand.Parameters,它似乎具有所有參數,不僅僅是在命令行上傳遞的參數......請參閱下面的接受答案。
  • 獲取變量似乎包括在結果列表的可選變量,但我不知道如何從其他變量

回答

2

以下區分他們似乎對我的盒子工作...可能不是最好的方式做到這一點,但它似乎在這種情況下工作,至少...

[cmdletbinding()] 

param([Parameter(Mandatory=$True)] 
[string] $AFile = "C:\A\Path", 

[Parameter(Mandatory=$True)] 
[ValidateSet("A","B","C", "D")] 
[string] $ALetter = "A", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional1 = "Foo", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional2 = "Bar" 
) 

echo "Hello World!" 

($MyInvocation.MyCommand.Parameters).Keys | %{ 
    $val = (Get-Variable -Name $_ -EA SilentlyContinue).Value 
    if($val.length -gt 0) { 
     "($($_)) = ($($val))" 
    } 
} 

保存爲allparams.ps1,並運行它看起來像:

.\allparams.ps1 -ALetter A -AFile "C:\Another\Path" 
Hello World! 
(AFile) = (C:\Another\Path) 
(ALetter) = (A) 
(Optional1) = (Foo) 
(Optional2) = (Bar) 
+0

輝煌;謝謝! :o) – iokevins

1

使用AST:

[CmdletBinding()] 
Param (
[Parameter(Mandatory=$True)] 
[string] $AFile = "C:\A\Path", 

[Parameter(Mandatory=$True)] 
[ValidateSet("A","B","C", "D")] 
[string] $ALetter = "A", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional1 = "Foo", 

[Parameter(Mandatory=$False)] 
[ValidateNotNullOrEmpty()] 
[string] $Optional2 = "Bar" 
) 

echo "Hello World!" 
$psboundparameters.keys | ForEach { 
    Write-Output "($_)=($($PSBoundParameters.$_))" 
} 


$ast = [System.Management.Automation.Language.Parser]:: 
    ParseFile($MyInvocation.InvocationName,[ref]$null,[ref]$Null) 

$ast.ParamBlock.Parameters | select Name,DefaultValue 
+0

謝謝你,mjolinor:o)我已經證實這也適用 - 做得很好。儘管如此,我確定接受的答案看起來更清晰一些,可以用於通用目的。再次感謝。 – iokevins

+1

接受的答案似乎告訴你什麼是通過的值(與$ PsBoundParameters相同),而不是默認值。 – mjolinor

+0

謝謝您澄清 - 這代表非常有用的信息!最初,我錯過了這個區別。對於我的用例,我想將腳本參數記錄到文件中,以便稍後查看腳本行爲...所以我希望實際傳遞的值(如果存在)而不是默認值。這*是*有用的知識,但它可能會在未來有所幫助;謝謝。 – iokevins