首页 > 解决方案 > 如何在不生成 PSScriptAnalyzer 警告的情况下创建区分大小写的 Hashtable?

问题描述

默认情况下,由 PowerShell 创建的哈希表(例如$hashtable = @{})不区分大小写。

对于我的脚本,我想显式创建一个区分大小写的哈希表。

这可以通过以下方式完成:

$hashtable = [hashtable]::new()

或者:

$hashtable = New-Object hashtable

但我想让我的脚本也符合默认的PSScriptAnalyzer规则。对于上述区分大小写的哈希表示例,UseLiteralInitializerForHashtable规则会发出警告:

使用文字初始值设定项 @{{}} 来创建哈希表,因为它们默认不区分大小写

我希望能够通过指定来解决这个问题StringComparer,例如:

[HashTable]::New(0, [StringComparer]::Ordinal)

但这仍然会产生错误(尽管[HashTable]::New(0, [StringComparer]::OrdinalIgnoreCase)不会)。
AFAIK,没有类似的东西:[StringComparer]::OrdinalMatchCase,或者?

如何在不生成 PSScriptAnalyzer 警告的情况下创建区分大小写的 Hashtable?

PSScriptAnalyzer 版本:1.18.3
测试了 Windows PowerShell ( 5.1) 和 PowerShell Core ( 6.2.3)

重现警告的步骤:

Invoke-ScriptAnalyzer -ScriptDefinition '[HashTable]::New(0, [StringComparer]::Ordinal)'

标签: powershellhashtablecase-sensitivepsscriptanalyzer

解决方案


您是否尝试过使用内联 c# 将哈希表封装为自定义静态类?

Add-Type -typedef @"
    using System;
    using System.Collections;

    namespace myCsharp 
    {
        //-----------------------------------------
        public class myHashtable
        //-----------------------------------------
        {

            //-------------------------------------
            public static Hashtable GetHashtable()
            //-------------------------------------
            {
                Hashtable ht = new Hashtable( 0, StringComparer.Ordinal);
                return ht;
            }

        }
    }
"@

$x = [myCsharp.myHashtable]::GetHashtable()

推荐阅读