我正在尝试弄清楚如何在将包含其他参数值的参数传递给函数时强制PowerShell运行时在表达式模式下解析字符串。例如,我想使用第一个参数的值将两个参数传递给第二个参数的函数。我知道我需要让解析器在表达式模式下评估第二个参数值,但输出似乎不能解析第一个参数的值。
PowerShell命令#1 此示例按预期工作,并证明在使用2 + 2
附近的子表达式时,在表达式模式下评估命令& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $(2 + 2)"
输出
foo
Test 1 value: 4
PowerShell命令#2 现在,当我尝试使用参数2($ test2)引用参数1($ test1)的值时,表达式似乎没有被计算,或者至少$ test1的值为空或空。
& { param($test1,$test2); $test1; $test2 } "foo" "Test 1 value: $($test1)"
输出
foo
Test 1 value:
注意当我认为它应该是“foo”时,Test 1值是空白的,这是$ test1参数中传递的值。我在PowerShell函数中缺少什么参数范围?为什么$ test1值不能在作为$ test2的值传递的表达式中引用?有更优雅的方式吗?
答案 0 :(得分:1)
这是因为在将参数传递给scriptblock之前,在scriptblock之外评估“表达式”。
类似于:
$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
答案 1 :(得分:0)
让我想起了schema \ 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
答案 2 :(得分:0)
感谢您的回复,这有助于澄清一些事情。最后,我想将参数从数据库传递给脚本。参数值包括对其他PowerShell参数的引用,并且在脚本运行之前无法解析它们。我正在IIS中运行PowerShell运行空间,我无法弄清楚如何使用标准“”字符强制解析器评估表达式。
唉,我在PowerShell中找到了$ ExecutionContext.InvokeCommand.ExpandString()函数,它完全符合我的需要。这个函数实际上是由http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-12-command-discovery-and-scriptblocks.aspx#executioncontext中记载的“”字符执行的。
我需要做一些额外的工作,但我能够使用以下模式来解析脚本中的值。这会强制解析器在表达式模式下重新计算$ test2并执行变量替换,从而生成包含正确变量值的字符串。
$test2 = $ExecutionContext.InvokeCommand.ExpandString($test2)
再次感谢您的评论和指导!