【问题标题】:Powershell Set-Variable resets Variable instead of updating itPowershell Set-Variable 重置变量而不是更新它
【发布时间】: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-VariableSet-Variable 在很大程度上都是多余的,除非与不能折叠成常规变量访问的选项一起使用,是的。绝大多数脚本对它们没有用处。但是,进行类型适当的访问并不是 Set-Variable 的设计目的,您甚至不需要它。假设您事先不知道变量名,但知道它应该是一个散列,(Get-Variable "TestVariable").Value.Name1 = "NewValue" 也可以。 “真正的”问题(如果你可以这么说的话)是 Hashtable 是引用类型,而不是值类型。

标签: powershell


【解决方案1】:

不像名称Set-Variable 可能暗示它用于编辑变量值,它仅用于编辑变量属性,例如-Scope,-Visibility,-Description 等。其中可以是变量的-Value,但只有值作为一个整体而不是值属性,因为Set-Variable 在任何时候都不关心值属性,因此无法编辑它们。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多