Powershell中的复合动态参数

时间:2018-01-19 16:11:06

标签: powershell

我试图在同一个cmdlet中使用两个动态参数。问题是我希望第二个动态参数使用第一个参数来填充结果集。

例如,使用命令的语法可能是这样的 -

Get-MSRP -Manufacturer Jeep -Trim Rubicon

'制造商'是一个动态参数,用于查看磁盘上的文件以填充用户的值。我会“修剪”使用用户选择创建“修剪”结果集的“制造商”选项。

我的'制造商'工作正常,但我相信,当我为'Trim'创建的DynamicParam的代码已经运行时,用户选择的值不可用。

任何帮助?

function createLayout(responseContent) {
    return document.createElement("article"); 
}

}

最小和最小可验证的

function Get-MSRP{
    [cmdletbinding()]
    param()
    DynamicParam{
        $Param1 = "Manufacturer",0,{GC c:\temp\manufacturers.txt},$False
        $Param2 = "Trim",1,{GC c:\temp\$Manufacturer\Trim.txt},$False
        Get-DynamicParameterSet $Param1,$Param2
    }
    begin{
        $Manufacturer = $PSBoundParameters["Manufacturer"]
        $Trim = $PSBoundParameters["Trim"]
    }
    process{
        return Invoke-Sqlcmd -Database 'db' -ServerInstance 'server' -Query 
        "Select MSRP from pricing.MSRP where Manufacturer = '$Manufacturer' 
        and Trim = '$Trim'"
    }
}


function Get-DynamicParameterSet{
    param($Params)
    $RuntimeParameterDictionary = New-Object 
System.Management.Automation.RuntimeDefinedParameterDictionary
    if($Params[0].GetType().Name -eq "String" ){
        Write-Debug "Single Param to build"
        $RuntimeParameterDictionary = BuildSet $Params[0] $Params[1] 
$([Scriptblock]$Params[2]) $Params[3] $Params[4] $RuntimeParameterDictionary
    }else{
        foreach($Param in $Params){
            $RuntimeParameterDictionary = BuildSet $Param[0] $Param[1] 
            $([Scriptblock]$Param[2]) $Param[3] $Param[4] 
            $RuntimeParameterDictionary
        }
    }
    return $RuntimeParameterDictionary
}

function BuildSet{
    param(
        $ParameterName,
        [int]$Position,
        [ScriptBlock]$scriptBlock,
        $Mandatory,
        $SetNames,
          [System.Management.Automation.RuntimeDefinedParameterDictionary]$RuntimeParameterDictionary)

    Write-Debug "Setting up $ParameterName"
    $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]

    $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
    $ParameterAttribute.Mandatory = $Mandatory
    $ParameterAttribute.Position = $Position
    $ParameterAttribute.ParameterSetName = $SetNames

    $AttributeCollection.Add($ParameterAttribute)
    Write-Debug "Generating result set"
    $arrSet = Invoke-Command $scriptBlock
    Write-Debug "Generated as $arrSet"
    $ValidateSetAttribute = New-Object System.Management.Automation.ValidateSetAttribute($arrSet)

    $AttributeCollection.Add($ValidateSetAttribute)

    $RuntimeParameter = New-Object System.Management.Automation.RuntimeDefinedParameter($ParameterName, [string], $AttributeCollection)
    $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter)
    return $RuntimeParameterDictionary

1 个答案:

答案 0 :(得分:0)

经过一些研究,我发现你不能拥有这种类型的复合动态参数'在powershell中,第二个动态参数使用来自用户第一个动态参数的变量输出。原因是这些值在运行命令之前不会绑定到动态参数。

关于动态参数的另一个注释,使用它们时不遵守ValueFromPipeline顺序!