【问题标题】:PowerShell define Object in Function?PowerShell 在函数中定义对象?
【发布时间】:2017-05-24 07:46:12
【问题描述】:

我需要重新定义函数中的对象吗?

我有以下 main.ps1

$MyDict = New-Object 'system.collections.generic.dictionary[string,string]' 
loadDict([ref]$MyDict)

我有一个带有函数的functions.psm1

function loadDict([ref]$return)
{
    #pseudo - load data from table
    foreach ($TableRow in $LoadTable){
        if($return.ContainsKey($TableRow.KEYID) -eq $false){
            $return.Add($TableRow.KEYID, $TableRow.TEXT.Trim())
        }
    }
}

但我得到以下错误..

[System.Management.Automation.PSReference'1[[System.Collections.Generic.Dictionary'2[[System.String, mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]], mscorlib,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089]]] "ContainsKey" 方法未找到

当我不调用函数,而是在Main中使用函数代码时,没有问题。

(更正了“[”错字)

【问题讨论】:

    标签: function powershell dictionary


    【解决方案1】:

    答案是。您无需重新定义对象。

    就像提到的 Esperento57 一样,您的 if 条件中有一个 [。无论如何,您可以考虑使用 bultin hashtable

    function loadDict
    {
        Param
        (
            [hashtable]$MyDict
        )
        #pseudo - load data from table
        foreach ($TableRow in $LoadTable)
        {
            if($MyDict.ContainsKey($TableRow.KEYID) -eq $false)
            {
                $MyDict.Add($TableRow.KEYID, $TableRow.TEXT.Trim())
            }
        }
    }
    
    $MyDict = @{}
    loadDict([ref]$MyDict)
    

    【讨论】:

    • 谢谢,我从我的一个朋友那里得到了那个“字典”的东西,他告诉我它比 bultin hashtable 快得多。我有几个几百兆“厚”的表。我会尝试您的解决方案并提供反馈。
    • 你能给我们提供一个$LoadTable的例子吗?您可能可以通过一次填充列表来加速您的脚本。
    • :/ 对不起,它包含内部 ERP 数据。他们持有例如 ShopItem 描述和东西。我所做的是 .. 每天加载一次字典并将它们保存在 RAM 中。因此,从 SQL Server 加载 Dict 大约需要 10 分钟,这确实非常快。但是我需要在将某些数据存储在该字典中之前对其进行转换或连接。
    • Hashtable 的工作方式完全一样,而且并不比 dict 慢。我不擅长测量时间。
    【解决方案2】:

    将 ref 删除到您的参数中并输入如下类型:

    function loadDict([system.collections.generic.dictionary[string,string]]$return)
    {
        #pseudo - load data from table
        foreach ($TableRow in $LoadTable){
            if($return.ContainsKey($TableRow.KEYID) -eq $false){
                $return.Add($TableRow.KEYID, $TableRow.TEXT.Trim())
            }
        }
    }
    
    $MyDict = New-Object 'system.collections.generic.dictionary[string,string]' 
    loadDict($MyDict)
    

    【讨论】:

    • 有了这个我有无效数据错误,+ FullyQualifiedErrorId : ParameterArgumentTransformationError
    • 我试过这个,这个代码可以工作。你现在有另一个问题。可能是你的负担
    猜你喜欢
    • 2022-12-06
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    相关资源
    最近更新 更多