繁体   English   中英

在参数中解析PowerShell函数参数值

[英]Resolve PowerShell Function Parameter Values Among Parameters

我试图弄清楚在将包含另一个参数值的参数传递给函数时,如何强制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)引用参数一($ test1)的值时,表达式似乎没有被求值,或者至少$ test1的值为空或空值。

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

输出量

foo
Test 1 value:

请注意,当我认为测试1值应为$ foo1(在$ test1参数中传递的值)时,该值为空白。 关于PowerShell函数中的参数范围,我缺少什么? 为什么$ test1值不能作为$ test2的值传递给表达式? 有没有更优雅的方法可以做到这一点?

这是因为“表达式”是在脚本块之外求值的,甚至没有将参数传递给脚本块。

所以像这样:

$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

让我想起了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

感谢您的答复,这有助于澄清一些问题。 最终,我想将参数从数据库传递给脚本。 参数值包括对其他PowerShell参数的引用,并且只有在脚本运行后才能解析。 我在IIS中运行PowerShell的运行空间,我不知道如何强制解析器使用标准的“”字符来评估表达式。

las,我发现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)

再次感谢您的评论和指导!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM