Разрешить значения параметров функции PowerShell среди параметров - PullRequest
0 голосов
/ 26 сентября 2011

Я пытаюсь выяснить, как заставить PowerShell выполнять синтаксический анализ строки в режиме выражения при передаче параметра, содержащего значение другого параметра, в функцию.Например, я хочу передать два параметра в функцию со вторым параметром, используя значение первого параметра.Я знаю, что парсер должен оценить значение второго параметра в режиме выражения, но выходные данные, похоже, не разрешают значение первого параметра.

PowerShell Command # 1 Этот пример работает так, как нужно, и подтверждает, что командавычисляется в режиме выражения при использовании подвыражения около 2 + 2

& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $(2 + 2)"

Вывод

foo
Test 1 value: 4

PowerShell Command # 2 Теперь, когда я пытаюсь сделать то же самое, чтобы получить параметр два ($test2) ссылаются на значение для параметра один ($ test1), выражение, кажется, не оценивается или, по крайней мере, значение для $ test1 пустое или пустое.

& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $($test1)"

Выходные данные

foo
Test 1 value:

Обратите внимание, что значение Test 1 пустое, когда я думаю, что оно должно быть "foo", значением, переданным в параметре $ test1.Что мне не хватает в области параметров в функции PowerShell?Почему значение $ test1 недоступно для ссылки в выражении, переданном в качестве значения для $ test2?Есть ли более элегантный способ сделать это?

Ответы [ 3 ]

1 голос
/ 26 сентября 2011

Это потому, что «выражение» вычисляется вне блока сценариев, прежде чем даже передать аргументы в блок сценария.

Так что-то вроде:

$test1 = 4
& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $($test1)"

выдаст вывод:

foo
Test 1 value: 4

Обходные:

& { param($test1,$test2); $test1; & $test2 } "foo" {"Test 1 value: $test1"}

Но я полагаю, что в реальной ситуации вы не захотите менять блок скрипта (или функцию и т. Д.), С которым вы работаете.

Я бы также поставил под сомнение необходимость этой ситуации, поскольку то, что вы действительно хотите сделать, это:

$test1 = "foo"
$test2 = "Test 1 value: $test1"
& { param($test1,$test2); $test1; $test2 } $test1 $test2
0 голосов
/ 27 сентября 2011

Спасибо за ответы, и это помогает уточнить некоторые вещи.В конечном счете, я хочу передать параметры в скрипт из базы данных.Значения параметров включают ссылки на другие параметры PowerShell, и они не могут быть разрешены, пока не будет запущен сценарий.Я запускаю пространство выполнения PowerShell в IIS и не могу понять, как заставить анализатор вычислять выражение, используя стандартные символы "".

Увы, я обнаружил $ ExecutionContext.InvokeCommand.ExpandString () функция в PowerShell, которая делает именно то, что мне нужно.Эта функция на самом деле выполняется под прикрытием символами "", как описано в http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-12-command-discovery-and-scriptblocks.aspx#executioncontext.

. Чтобы сделать то, что я хочу, требуется немного больше работы, но я смог использовать следующий шаблон для разрешения значений всценарий.Это заставляет синтаксический анализатор переоценивать $ test2 в режиме выражения и выполнять подстановку переменной, в результате чего получается строка, содержащая правильные значения переменной.

$test2 = $ExecutionContext.InvokeCommand.ExpandString($test2)

Еще раз спасибо за комментарии и указания!

0 голосов
/ 26 сентября 2011

напоминает мне схему \ lisp!Вы можете передавать функции как параметры на этом языке - я не знаю, можете ли вы передать скрипт-блок в качестве параметра в PS.

В любом случае, имеет ли значение, что вы ссылаетесь на имя переменной?

Если нет, и вы просто хотите сослаться на первую переменную (или переменную по вашему выбору), вы можете сделать что-то вроде этого:

 & { $args[0]; $args[1]; "Value of arg #$($args[1]): $($args[$($args[1])])"} "foo" "0"

работает с другими несколькими переменными:

& { $args[0]; $args[1]; "Value of arg #$($args[1]): $($args[$($args[1])])"} "foo" "3" 23 24 25 26
...