在字符串中包含条件的PowerShell if语句

gcxthw6b  于 2023-01-02  发布在  Shell
关注(0)|答案(3)|浏览(155)

我有一个存储在字符串变量中的条件,我想在if语句中使用它。
在这个例子中,总是有一个匹配,因为变量不是零或空,等等。它不是作为条件“执行”变量。
我希望“执行”变量中存储的条件。

$myCheckTest = '$test -eq 4'
$test = 5

if ($myCheckTest) {
    write-host "TEST MATCH"
} else {
    write-host "TEST NO MATCH"
}

这不需要引号,如:$myCheckTest = $test -eq 4,但条件是外部存储在json文件中的。
我也尝试了if ( & {$myCheckTest} ) {,因为我认为这与JavaScript if ( eval(condition) )相当,但这仍然没有给我正确的答案“测试不匹配”,我期望。
我知道powershell IF condition in a Variable,但这里的条件不像我那样在字符串变量中。

hc2pp10m

hc2pp10m1#

可以使用$ExecutionContext.InvokeCommand.ExpandString方法计算字符串表达式:

$test = 5
$myCheckTest = '$test -eq 4'
$ExecutionContext.InvokeCommand.ExpandString("`$($myCheckTest)")
False
$myCheckTest = '$test -eq 5'
$ExecutionContext.InvokeCommand.ExpandString("`$($myCheckTest)")
True

注意,反勾号(```)防止第一个美元被替换,因此实际的字符串表达式将类似于:$($test -eq 4)
或在您的函数中:

if ($ExecutionContext.InvokeCommand.ExpandString("`$($myCheckTest)")) {
    write-host "TEST MATCH"
} else {
    write-host "TEST NO MATCH"
}

执行此类操作的一种更常见的方法是使用脚本块:

$myCheckTest = {$test -eq 4}
$test = 5

if (&$myCheckTest) {
    write-host "TEST MATCH"
} else {
    write-host "TEST NO MATCH"
}
of1yzvn4

of1yzvn42#

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression
一位同事向我介绍了Invoke-Expression命令:

if (Invoke-Expression $myCheckTest) {
    write-host "TEST MATCH"
} else {
    write-host "TEST NO MATCH"
}

这在我的实际脚本中是有效的。

soat7uwm

soat7uwm3#

您可以使用ScriptBlock.InvokeWithContext来执行以下操作:

$myCheckTest = '$test -eq 4'

# Convert the string to ScriptBlock
$sb  = [scriptblock]::Create($myCheckTest)
# Argument to feed to the ScriptBlock
$arg = [psvariable]::new('test', 5)

if ($sb.InvokeWithContext(@{}, $arg)) {
    write-host "TEST MATCH"
}
else {
    write-host "TEST NO MATCH"
}

相关问题