gpt4 book ai didi

powershell - 是否可以在 PowerShell 中创建不可修改的哈希表?

转载 作者:行者123 更新时间:2023-12-04 07:53:03 25 4
gpt4 key购买 nike

我熟悉使用 Set-Variable 在 PowerShell 中创建只读变量和常量。类似这样的命令:

Set-Variable -Option ReadOnly, AllScope -Name STANDARD_TOKEN_PARAMS -Force -Value @{
Username = 'username'
Password = 'password'
ClientId = 'clientID'
}
或者转至子 ReadOnlyConstant对于不可移除的变量。
我假设与 ReadOnly选项我将无法修改集合,但事实并非如此。例如, $STANDARD_TOKEN_PARAMS.someNewEntry = 'newEntry'有效并相应地修改集合。
是否有类似的命令可用于在 PowerShell 中创建真正的“只读”集合?

最佳答案

选项 ReadOnlyConstant是变量(数据持有者)概念:它们仅防止为变量分配新值,它们不防止修改只读/常量变量不变存储的值。
为了防止修改值(对象)本身,您必须另外使用只读数据类型[1] 存储在只读/常量变量中。要获得只读哈希表(字典),请使用通用 System.Collections.ObjectModel.ReadOnlyDictionary[TKey, TValue] 类型:

Set-Variable -Option ReadOnly, AllScope -Name STANDARD_TOKEN_PARAMS -Value $(
$dict = [System.Collections.Generic.Dictionary[string, string]]::new(
[System.StringComparer]::OrdinalIgnoreCase
)
$dict.Add('Username', 'username')
$dict.Add('Password', 'password')
$dict.Add('ClientId', 'clientID')
[System.Collections.ObjectModel.ReadOnlyDictionary[string, string]]::new($dict)
)
笔记:
  • 不幸的是,您不能直接初始化 ReadOnlyDictionary[TKey, TValue]来自 PowerShell 的实例 [hashtable] ,因为泛型 IDictionary - 需要实现具有匹配类型的实例;因此,辅助 System.Collections.Generic.Dictionar[TKey, TValue] 实例被使用。
  • 请注意 [System.StringComparer]::OrdinalIgnoreCase参数传递给辅助。字典,确保键查找不区分大小写,就像 PowerShell 中的默认方式[hashtables] .[2]
  • 而由此产生的$STANDARD_TOKEN_PARAMS从 PowerShell Core 7.1 开始,只读变量的值实际上也是只读的,意外尝试修改只读字典会导致不明显的错误消息:
  • $STANDARD_TOKEN_PARAMS['Username'] = 'foo'无益的报告:Unable to index into an object of type "System.Collections.ObjectModel.ReadOnlyDictionary 2[System.String,System.String]`
  • $STANDARD_TOKEN_PARAMS.Add('foo', 'bar')无益的报告:Cannot find an overload for "Add" and the argument count: "2"
  • $STANDARD_TOKEN_PARAMS.Clear()无益的报告:Cannot find an overload for "Clear" and the argument count: "0".
  • 仅使用点符号会提供有用的错误消息:$STANDARD_TOKEN_PARAMS.Username = 'foo'报告 Collection is read-only.
  • GitHub issue #15118建议改进这些错误信息。


  • [1] 这并不总是必要的,即如果值是定义不可变的 .NET 原始类型(无属性类型,例如 [int])或 [string] 的实例,则不需要。 .
    [2] 注意 [hashtable]在 Windows PowerShell 和(过时的)PowerShell Core 6.1 及以下版本中使用 [System.StringComparer]::CurrentCultureIgnoreCase ,即文化敏感的查找 - 见 this GitHub issue背景信息。

    关于powershell - 是否可以在 PowerShell 中创建不可修改的哈希表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66857718/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com