首页 > 解决方案 > If语句反对动态变量

问题描述

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

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

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

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

标签: powershellif-statementvariablesforeachindirection

解决方案


代替

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

和:

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

也就是说,如果您的变量名称仅通过可扩展字符串间接知道,则您不能直接引用它(就像您通常使用$sigil 一样) - 您需要通过获取它的值Get-Variable,如上所示。

但是,正如JohnLBevan指出的那样,您可以将变量对象存储在另一个(非动态)变量中,这样您就可以通过.Valueproperty获取和设置动态变量的值。
添加-PassThruNew-Variable调用中直接返回变量对象,无需后续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' }

推荐阅读