Powershell - передать значение параметру - PullRequest
0 голосов
/ 18 апреля 2020

Как передать значение вместе с параметром? Нечто подобное. /test.ps1 -controllers 01. Я хочу, чтобы скрипт использовал hyphen, а также для параметра передается значение.

Вот часть скрипта, которую я написал. Но если я вызываю скрипт с hyphen (.\test.ps1 -Controllers), он говорит: A parameter cannot be found that matches parameter name 'Controllers'.

param(
   # [Parameter(Mandatory=$false, Position=0)]
    [ValidateSet('Controllers','test2','test3')]
    [String]$options

)

Также мне нужно передать ему значение, которое затем используется для свойства.

if ($options -eq "controllers")
{
   $callsomething.$arg1 | where {$_ -eq "$arg2" }
}

1 Ответ

0 голосов
/ 19 апреля 2020

Давайте поговорим о том, почему это не работает

function Test()
    param(
        [Parameter(Mandatory=$false, Position=0)]
        [ValidateSet('Controllers','test2','test3')]
        [String]$options
    )
}

Параметры - это переменные, которые создаются и заполняются в начале скрипта

ValidateSet разрешит выполнение сценария, только если $Options равен одному из трех вариантов 'Controllers','test2','test3'

Давайте поговорим о том, что именно все [] делают

Mandatory=$false означает, что $options не обязательно должен быть чем-то, что нужно для запуска скрипта.

Position=0 означает, что если вы ввели скрипт без использования -options, то первое, что вы добавите, все равно будут опции

Пример

#If Position=0 then this would work
Test "Controllers"
#Also this would work
Test -options Controllers

[ValidateSet('Controllers','test2','test3')] означает, что если используется Option или Mandatory, то оно должно равняться 'Controllers','test2','test3'

Звучит так, как будто вы пытаетесь создать параметры во время выполнения. Ну, это возможно, используя DynamicParam.

function Test{
    [CmdletBinding()]
    param()
    DynamicParam {
        $Parameters  = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        'Controllers','test2','test3' | Foreach-object{
            $Param  = New-Object System.Management.Automation.ParameterAttribute
            $Param.Mandatory  = $false
            $AttribColl = New-Object  System.Collections.ObjectModel.Collection[System.Attribute]
            $AttribColl.Add($Param)
            $RuntimeParam  = New-Object System.Management.Automation.RuntimeDefinedParameter("$_",  [string], $AttribColl)
            $Parameters.Add("$_",  $RuntimeParam) 
        }
        return $Parameters
    }
    begin{
        $PSBoundParameters.GetEnumerator() | ForEach-Object{
            Set-Variable $_.Key -Value $_.Value
        } 
    }
    process {

        "$Controllers $Test2 $Test3"

    }
}

DynamicParam позволяет создавать параметры в коде. Приведенный выше пример превращает массив 'Controllers','test2','test3' в 3 отдельных параметра.

Test -Controllers "Hello" -test2 "Hey" -test3 "Awesome"

возвращает

Hello Hey Awesome

Но вы сказали, что хотите сохранить hypen и параметр

Таким образом, строка

$PSBoundParameters.GetEnumerator() | ForEach-Object{
    Set-Variable $_.Key -Value $_.Value
}

позволяет определить значение каждого параметра. небольшое изменение как:

$PSBoundParameters.GetEnumerator() | ForEach-Object{
    Set-Variable $_.Key -Value "-$($_.Key) $($_.Value)"
}

Вернется

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