我从一个文件中提取了很多值,根据每个变量的值,我知道如何通过foreach循环来改变这些值。但有些事情并不像我预期的那样有效。下面是一个例子:
$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中的值从1、2、3更改为Red、Green、Blue
我做错了什么?
发布于 2018-03-04 19:20:40
虽然数组实际上是$D,但您正在遍历$C中的元素,但仅凭此更改并不能解决这个问题。
解决方案取决于您在变量a -> c中拥有的对象的类型。如果它们是int,bool ++,则它们是值类型,只是在循环中复制到$Element。修改循环中的$Element只会更新存储在$Element中的值,而$a保持不变。
但是,如果变量包含引用类型的“普通对象”,则$Element包含指向该对象的指针,并且对$Element的修改也将反映在$a中。
虽然示例中的string实际上是一个引用类型,但它的行为类似于值类型($Element =..不会更新$a),因为它是不可变的,这意味着它不会改变,但实际上在每次修改时都会创建一个新对象。
您可以使用Get-Variable通过在数组中传入变量名来访问变量。这样,它将同时支持这两种类型。示例:
#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"
}
}更新:如果你只需要在执行时转换一个值,你可以创建一个函数或哈希表,例如:
$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])https://stackoverflow.com/questions/49094038
复制相似问题