PowerShell在函数中定义对象?

时间:2017-05-24 07:46:12

标签: function powershell dictionary

我是否需要在函数中重新定义对象?

我有以下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,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],   mscorlib,版本= 4.0.0.0,文化=中性,   PublicKeyToken = b77a5c561934e089]]]“ContainsKey”未找到方法

当我不调用函数,但使用Main中的函数代码时,没有问题。

(更正“[”错字)

2 个答案:

答案 0 :(得分:0)

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

与Esperento57提到的一样,你的if条件中有一个[。无论如何,您可以考虑使用bultin 哈希表

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)

答案 1 :(得分:0)

将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)