针对动态变量的 If 语句

If Statement Against Dynamic Variable

我正在尝试做类似于以下的事情...

New-Variable -Name "state_$name" -Value "True"
if ("state_$name" -eq "True") {
    Write-Host "Pass"
} else {
    Write-Host "Fail"
}

我已经尝试了多种不同的方法,但它并没有完全按照我希望的方式工作。我需要编写 if 语句来说明动态变量,因为这些值将在 foreach 循环内发生变化。

我在上面提供了一个简单的例子来证明概念。

替换

if ("state_$name" -eq "True") {

与:

if ((Get-Variable -ValueOnly "state_$name") -eq "True") {

也就是说,如果您的变量名称仅通过可扩展字符串间接已知,则您不能直接引用它(就像您通常使用 $ 印记) - 你需要通过Get-Variable获取它的值,如上图

但是,正如 JohnLBevan 指出的那样,您可以 将变量 object 存储在另一个(非动态)变量中,这样您就可以然后通过 .Value 属性.
获取和设置动态变量的值 将-PassThru添加到New-Variable直接调用returns变量对象,无需后续Get-Variable调用:

$dynamicVarObject = New-Variable -Name "state_$name" -Value "True" -PassThru
if ($dynamicVarObject.Value -eq "True") {
    "Pass"
} else {
    "Fail"
}

也就是说,通常有更好的替代方法来以这种方式创建变量,例如使用 hashtables:

$hash = @{}
$hash.$name = 'True'

if ($hash.$name -eq 'True') { 'Pass' } else { 'Fail' }