【问题标题】:Display All Powershell Script Parameter Default Variables显示所有 Powershell 脚本参数默认变量
【发布时间】:2014-03-19 05:19:51
【问题描述】:

假设我有一个像这样的 Powershell 脚本 TestParameters.ps1,有两个强制性的命名参数和两个可选参数:

[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 设置变量 $Optional1 和 $Optional2 ...但是我如何轻松地将它们显示到屏幕上,就像我使用 $PSBoundParameters 的方式一样?

我确实想在每次有脚本时简单地编写以下内容:

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

注意事项:

  • $args 似乎只包含未绑定的参数,而不是默认值 参数
  • $MyInvocation 似乎只包括在命令行上传递的命令编辑:MyInvocation 有成员变量 MyCommand.Parameters,它似乎有所有的参数,而不仅仅是那些在命令行上传递的...见接受的答案,如下。
  • Get-Variable 似乎在结果列表中包含可选变量,但我不知道如何将它们与其他变量区分开来

【问题讨论】:

    标签: powershell


    【解决方案1】:

    以下似乎适用于我的盒子......可能不是最好的方法,但它似乎在这种情况下工作,至少......

    [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)
    

    【讨论】:

      【解决方案2】:

      使用 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
      

      【讨论】:

      • 谢谢你,mjolinor : o ) 我已经确认这也有效——做得很好。不过,对于通用用途,我确定接受的答案似乎更清晰。再次感谢。
      • 接受的答案似乎告诉您传递的值是什么(与 $PsBoundParameters 相同),而不是默认值。
      • 感谢您的澄清——这是非常有用的信息!最初,我错过了这种区别。对于我的用例,我想将脚本参数记录到文件中,以便我们稍后查看脚本行为......所以我希望实际传递的值(如果存在)而不是默认值。不过,这有用的知识,将来可能会有所帮助;谢谢。
      • 如果是这种情况,那么接受的答案对您的应用程序来说是正确的。该 AST 解决方案适用于您想要显示默认值的情况,无论传递的值是什么。
      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多