2014-02-19 47 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