首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据变量中的实际值更改多个变量的值

根据变量中的实际值更改多个变量的值
EN

Stack Overflow用户
提问于 2018-03-04 17:47:20
回答 2查看 50关注 0票数 0

我从一个文件中提取了很多值,根据每个变量的值,我知道如何通过foreach循环来改变这些值。但有些事情并不像我预期的那样有效。下面是一个例子:

代码语言:javascript
复制
$a="1"  
$B="2"  
$C="3"  
$D=$a, $b, $c  
Foreach ($Element in $C)  
{  
  If ($Element -eq "1")
  {
    $Element ="Red"
  }
  Elseif ($Element -eq "2")
  {
    $Element = "Green"
  }
  Else 
  {
    $Element = "Blue"
  }
}  

我所期望的是$a$b$c中的值从123更改为RedGreenBlue

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-04 19:20:40

虽然数组实际上是$D,但您正在遍历$C中的元素,但仅凭此更改并不能解决这个问题。

解决方案取决于您在变量a -> c中拥有的对象的类型。如果它们是intbool ++,则它们是值类型,只是在循环中复制到$Element。修改循环中的$Element只会更新存储在$Element中的值,而$a保持不变。

但是,如果变量包含引用类型的“普通对象”,则$Element包含指向该对象的指针,并且对$Element的修改也将反映在$a中。

虽然示例中的string实际上是一个引用类型,但它的行为类似于值类型($Element =..不会更新$a),因为它是不可变的,这意味着它不会改变,但实际上在每次修改时都会创建一个新对象。

您可以使用Get-Variable通过在数组中传入变量名来访问变量。这样,它将同时支持这两种类型。示例:

代码语言:javascript
复制
#Sample objects
$a=[pscustomobject]@{MyProperty="1"}
$B=[pscustomobject]@{MyProperty="2"}
$C="3"

$AutoUpdateVariables="a","b","c"

#If variables are value-type (ex. int), just remove .MyProperty
Foreach ($element in (Get-Variable -Name $AutoUpdateVariables))
{  
    If ($element.Value.MyProperty -eq "1")
    {
        $element.Value.MyProperty ="Red"
    }
    Elseif ($element.Value.MyProperty -eq "2")
    {
        $element.Value.MyProperty = "Green"
    }
    Elseif (-not $element.Value.MyProperty)
    {
        #If MyProperty doesn't exist/is null, set variable to "Blue"
        $element.Value = "Blue"
    }
}

更新:如果你只需要在执行时转换一个值,你可以创建一个函数或哈希表,例如:

代码语言:javascript
复制
$a="1"
$B="2"
$C="3"

$HashTable = @{
    "1" = "Red"
    "2" = "Green"
    "3" = "Blue"
}

#As a string value
"Hello '$a' you value should be '$($HashTable[$a])'"
"Hello '$b' you value should be '$($HashTable[$b])'"

#or as a parameter
Get-ChildItem -Path ($HashTable[$c])
票数 0
EN

Stack Overflow用户

发布于 2018-03-04 18:08:07

试试这个-

代码语言:javascript
复制
$a="1"  
$B="2"  
$C="3"  
$D=$a,$b,$c  
Foreach ($Element in $D)  
{  
If ($Element -eq "1")
{
$a ="Red"
}
Elseif ($Element -eq "2")
{
$b = "Green"
}
Else 
{
$c = "Blue"
}
}  

在您的代码中有两件事需要注意。首先,您没有在$D上迭代(您是在为$C迭代)。$c只有一个元素,您不需要为此使用foreach循环。其次,在foreach循环中,您只更改了$element的值,而没有更改$a$b$c的值。修复这些错误,您就可以开始工作了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49094038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档