【发布时间】:2020-10-13 17:37:11
【问题描述】:
我对如何使用Set-Variable 更改变量中的特定值感到困惑。我不明白由此产生的行为。我正在 Powershell 5.1 中尝试这个。
如果我用New-Variable 创建一个新变量
New-Variable -Name TestVariable -Value @{Name1 = 'Value1'; Name2 = 'Value2'}
然后我尝试用Set-Variable改变它
Set-Variable -Name TestVariable -Value @{Name1 = 'NewValue'}
为什么现在是我的输出:
Name Value
---- -----
Name1 NewValue
并没有像预期的那样:
Name Value
---- -----
Name1 NewValue
Name2 Value2
Set-Variable 似乎重置了整个变量而不是更改它。或者创建一个没有-Force 设置的新变量,这有点吓人。
微软文档的描述说:
Set-Variable cmdlet 将值分配给指定的变量或 改变当前值。如果变量不存在,则 cmdlet 创建它。
我是否误解了或更改部分?
我还尝试将参数存储在变量本身中,而不是在 -Value 之后将其写出,但这会导致与预期相同的行为。
现在,如果我在没有 Set-Variable 的情况下更改值,它就可以正常工作。
$TestNewVariable.Name1 = 'NewValue'
并且输出完全符合预期:
Name Value
---- -----
Name1 NewValue
Name2 Value2
解决方案不是更改变量中的值,而是再次写入所有值。但是我很想知道为什么Set-Variable 不只是改变价值或我做错了什么。
【问题讨论】:
-
这是正确的——您将
$TestVariable的值设置为一个全新的哈希表(您所看到的复合值实际上只是一回事,试试$TestVariable.GetType())。Set-Variable不能用于更改变量的 parts,因为它实际上并不关心变量的类型——您同样可以成功地将0值更改为新的哈希表。解决方案,如果你可以这样称呼的话,就是不要为此使用Set-Variable。您可以使用$TestVariable = @{}将事物初始化为空,然后随意填充。 -
这有点违背了拥有
Get-Variable的全部目的。Set-Variable似乎在做同样的事情,但优势不大。即使Set-Variable不关心实际存储的是什么,也无法更改实际值似乎仍然是一个缺陷。 -
Get-Variable和Set-Variable在很大程度上都是多余的,除非与不能折叠成常规变量访问的选项一起使用,是的。绝大多数脚本对它们没有用处。但是,进行类型适当的访问并不是Set-Variable的设计目的,您甚至不需要它。假设您事先不知道变量名,但知道它应该是一个散列,(Get-Variable "TestVariable").Value.Name1 = "NewValue"也可以。 “真正的”问题(如果你可以这么说的话)是Hashtable是引用类型,而不是值类型。
标签: powershell