2011-09-26 64 views
0

我想知道如何在将包含另一个参数值的参数传递给函数时,强制PowerShell运行时在表达式模式下解析字符串。例如,我想使用第一个参数的值将两个参数传递给第二个参数。我知道我需要解析器在表达式模式下计算第二个参数值,但输出似乎不能解析第一个参数的值。在参数中解析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: 

注意测试值1怎么是空的时,我觉得应该是“富”,在$ test1的参数传递的价值。我在PowerShell函数中缺少参数范围?为什么$ test1值无法在作为$ test2的值传递的表达式中引用?有没有更优雅的方式来做到这一点?

回答

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) 

再次感谢您的意见和指导!

+0

这很好,你发现,我猜你以后用'&$ test2'执行$ test?顺便说一句,如果这是答案,你应该标记它,左边的勾号做这项工作。 :-) – Matt

+0

我后来并没有使用&$ test2语法实际执行命令。相反,变量值将被解析并替换为原始字符串,以便在脚本中进一步使用。关键是强制解析器使用PowerShell中的ExpandString函数重新评估变量。 – JPC

1

这是因为在将参数传递给scriptblock之前,将在scriptblock之外评估“expression”。

因此,像:

$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"} 

但我的实际情况想,你不会想改变你正在使用的scriptblock(或函数等)。

我也质疑是否有必要针对这种情况,当你真正想做的事是这样的:

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

感谢您在第二个参数值周围使用脚本块的解决方法。这确实解决了问题并强制表达式模式解析。 – JPC

0

让我想起模式\口齿不清的!您可以将函数作为该语言的参数传递 - 我不知道您是否可以将PS脚本作为参数传递给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 
+0

感谢args系列的创意。名称很重要,因为在脚本中有参数名称的内部变量引用。我基本上允许参数通过在其他参数中使用一个参数的值来相互影响。 – JPC