передача аргумента в функции powershell

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

Мой код показан ниже:

function CheckErrorMessage {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateNotNullOrEmpty()]
        $Plugin

      , [Parameter(Mandatory = $true, Position = 1)]
        [ValidateNotNullOrEmpty()]
        $Report_Decission       
)

switch ($Plugin){

    'plugin-1' {

        $Report_Decission  

    }

    'plugin-2' {

       $Report_Decission  
    }

    Default {

   }
}
}#functions ends here

$test_1 = "no report"
$test_2 = "with report"

for($i=1; $i -ne 3; $i++){

CheckErrorMessage 'plugin-1' "$test_$i"  # i want to sent $test_1 or $test_2 from here
CheckErrorMessage 'plugin-2' "$test_$i"
}

когда я запускаю это, он печатает

1
1
2
2

но я хочу, чтобы результат выглядел так:

no report
no report
with report
with report

Заранее спасибо.


person Eric Ipsum    schedule 01.03.2017    source источник


Ответы (2)


Вы должны фактически вызвать это выражение, поэтому переменная расширяется, и вам нужно экранировать $ с помощью `, чтобы он не пытался ее расширить.

CheckErrorMessage 'plugin-1' $(iex "`$test_$i")

Вызов-выражение:

Командлет Invoke-Expression оценивает или запускает указанную строку как команду и возвращает результаты выражения или команды. Без Invoke-Expression строка, представленная в командной строке, будет возвращена (отображена) без изменений.

Ссылка: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/invoke-expression

редактировать: еще один способ сделать это (вероятно, лучше и безопаснее) от Матиаса

$ExecutionContext.InvokeCommand.ExpandString("`$test_$i")
person 4c74356b41    schedule 01.03.2017
comment
Вместо этого я бы выбрал ExpandString(): $ExecutionContext.InvokeCommand.ExpandString("`$test_$i") - person Mathias R. Jessen; 01.03.2017
comment
был бы счастлив, если бы вы рассказали некоторые подробности о iex, я имею в виду, как это работает - person Eric Ipsum; 01.03.2017

Альтернативный метод, который немного более понятен, заключается в использовании Get-Variable.

...
$test_1 = "no report"
$test_2 = "with report"

for($i=1; $i -ne 3; $i++) {
  CheckErrorMessage 'plugin-1' (Get-Variable "test_$i").Value
  CheckErrorMessage 'plugin-2' (Get-Variable "test_$i").Value
}
person Christopher G. Lewis    schedule 01.03.2017