Как создать динамические параметры для командлета сценария, прочитав проект msbuild? - PullRequest
0 голосов
/ 06 августа 2011

Я пытаюсь создать командлет сценария с динамическими параметрами для каждой цели в файле проекта MSBuild.Он работает с одним небольшим раздражением - он только автоматически заполняет статические параметры, пока я не наберу первые символы целевого параметра.

Далее следует мой сценарий с командлетом «Make-Project».

Что может заставить DynamicParam не возвращать параметры, если не введена первая часть параметра?

Set-Alias mk Make-Project

function Make-Project
{
    [CmdletBinding(DefaultParameterSetName="Build")]
    PARAM(
        [Parameter(ParameterSetName="Build")]
        [Switch]$Build,

        [Parameter(ParameterSetName="Clean")]
        [Switch]$Clean,

        [Parameter(ParameterSetName="Rebuild")]
        [Switch]$Rebuild,

        [ValidateSet( "q","quiet", "m","minimal", "n","normal", "d","detailed", "diag","diagnostic" )]
        [string]$BuildVerbosity,

        [Switch]$CertificationBuild,

        [Switch]$BuildDebug
    )

    PROCESS
    {
        # Defaults
        $certBuild = ""
        $target = "Usage"
        $buildTarget = "Build"
        $verbosity = "minimal"
        $configuration = "release"

        if ( [System.Convert]::ToBoolean( $env:project_build_debug ) )
            { $configuration = "debug" }

        foreach( $paramName in $MyInvocation.BoundParameters.Keys )
        {
            switch -RegEx ( $paramName )
            {
                "(?i)CertificationBuild"    { $certBuild = "cert" }
                "(?i)^(Build|Clean|Rebuild)$"   { $buildTarget = $paramName }
                "(?i)^BuildVerbosity$"      { $verbosity = $MyInvocation.BoundParameters[ $paramName ] }
                "(?i)^BuildDebug$"      { $configuration = "debug" }
                default             { $target = $paramName }
            } 
        }
        $msbuildexe = Get-MSBuildExe
        if ( $msbuildexe.Contains( "v4.0" ) )
            { $cmd = "$msbuildexe /v:$verbosity $certBuild /m /property:Configuration=$configuration /property:BuildTarget=$buildTarget /target:$target /property:CLR4=1 Project.proj" }
        else
            { $cmd = "$msbuildexe /v:$verbosity $certBuild /m /property:Configuration=$configuration /property:BuildTarget=$buildTarget /target:$target /tv:3.5 Project.proj" }
        Write-Host $cmd
        Invoke-Expression $cmd
    }

    DynamicParam
    {
        $projFile = '.\Project.Proj'
        $projXml = [xml]( Get-Content $projFile )

        $paramDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        $projXml.Project.Target | % { 
            $paramName = $_.Name
            $attribute = New-Object System.Management.Automation.ParameterAttribute
            $attribute.ParameterSetName = "__AllParameterSets"
            $attribute.Mandatory = $false
            $attributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
            $attributeCollection.Add($attribute)

            $param = New-Object System.Management.Automation.RuntimeDefinedParameter( $paramName, [Switch], $attributeCollection )
            $paramDictionary.Add( $paramName, $param )
        }
        return $paramDictionary
    }
}

function Get-MSBuildExe
{
    $bitness = ""
    if ( $env:PROCESSOR_ARCHITECTURE -eq "AMD64" )
        { $bitness = "64" }

    $msbuildexe = "$env:SystemRoot\Microsoft.NET\Framework${bitness}\v4.0.30319\MSBuild.exe"
    if ( -not (Test-Path $msbuildexe) )
        { $msbuildexe = "$env:SystemRoot\Microsoft.NET\Framework${bitness}\v3.5\MSBuild.exe" }

    $msbuildexe
}

1 Ответ

3 голосов
/ 08 августа 2011

Я бы посоветовал вам не добавлять несколько параметров переключателя. Вместо этого добавьте один динамический параметр с именем «Target» и добавьте к нему атрибут ValidateSet со списком целей.

Это полезная статья.

http://robertrobelo.wordpress.com/2010/02/12/add-parameter-validation-attributes-to-dynamic-parameters/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...