在PowerShell中嵌套动态参数

时间:2015-06-04 15:23:32

标签: powershell

我正在开发一个将一行插入SQL数据库的函数。它基本上是一个简单的更改日志,可以帮助我跟踪各种SQL实例上的更改。作为其中的一部分,我想要有以下参数:

  • 时间戳
  • 服务器
  • 实例
  • 更改

我已经找到了Timestamp,Change和Server,但实例给了我一些麻烦。 Server参数是动态的,因为它从我的库存中提取SQL服务器列表。然后,我希望该参数的值在另一个动态参数中使用,该参数将提取该服务器上的实例列表(也来自我的库存)。以下是我对动态部分的看法:

DynamicParam {
    if (!(Get-Module sqlps)){ Pop-Location; Import-Module sqlps -DisableNameChecking; Push-Location }
    $inventoryinstance = 'ServerName'
    $newparams         = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary

    $server_query      = 'SELECT [Name] FROM [ServerInventory].[dbo].[Servers] WHERE [TypeID] = 1 ORDER BY [Name]'
    $servers           = Invoke-Sqlcmd -serverinstance $inventoryinstance -query $server_query -connectiontimeout 5
    # Populate array
    $serverlist = @()
    foreach ($servername in $servers.Name) { 
        $serverlist += $servername
    }

    $attributes = New-Object System.Management.Automation.ParameterAttribute
    $attributes.ParameterSetName = "__AllParameterSets"
    $attributes.Position         = 1
    $attributes.Mandatory        = $true
    $attributes.HelpMessage      = "The server the change was made on"

    # Server list parameter setup
    if ($serverlist){ $servervalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $serverlist }
    $serverattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
    $serverattributes.Add($attributes)
    if ($serverlist){ $serverattributes.Add($servervalidationset) }
    $serverob = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Server", [String], $serverattributes)
    $newparams.Add("Server", $serverob)

    $instance_query  = "SELECT [Name] FROM [ServerInventory].[dbo].[SQLInstances] WHERE [ServerID] = (SELECT [ServerID] FROM [ServerInventory].[dbo].[Servers] WHERE [Name] = '$($PSBoundParameters.Server)')"
    $instances       = Invoke-Sqlcmd -serverinstance $inventoryinstance -query $instance_query -connectiontimeout 5
    # Populate array
    $instancelist = @()
    foreach ($instancename in $instances.Name) { 
        $instancelist += $instancename
    }

    $attributes = New-Object System.Management.Automation.ParameterAttribute
    $attributes.ParameterSetName = "__AllParameterSets"
    $attributes.Position         = 2
    $attributes.Mandatory        = $false
    $attributes.HelpMessage      = "The instance the change was made on, do not specify for server-level changes"

    # Server list parameter setup
    if ($instancelist){ $instancevalidationset = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $instancelist }
    $instanceattributes = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
    $instanceattributes.Add($attributes)
    if ($instancelist){ $instanceattributes.Add($instancevalidationset) }
    $instanceob = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("Instance", [String], $instanceattributes)
    $newparams.Add("Instance", $instanceob)            

    return $newparams
}

除了实例变量的值不自动完成外,其他所有内容似乎都有效。是否可以使用一个动态参数的值来生成另一个?

0 个答案:

没有答案