2017-05-24 1 views
1

関数でオブジェクトを再定義する必要はありますか?PowerShellは関数内のオブジェクトを定義しますか?

[システム..私はmain.ps1

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

次ていると私は機能

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()) 
     } 
    } 
} 

とfunctions.psm1を持っているが、私は次のエラーを取得します.Management.Automation.PSReference'1 [[System.Collections.Generic.Dictionary'2 [[System.String、 mscorlib、Version = 4.0.0.0、Culture =ニュートラル、 なPublicKeyToken = b77a5c561934e089]、[可能System.String、mscorlib、 バージョン= 4.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089]]、 mscorlib、バージョン= 4.0.0.0、文化=中立、 なPublicKeyToken = b77a5c561934e089] ]] "ContainsKey"メソッドが見つかりません

私は関数を呼び出すのではなく、関数コードをメインで使用すると問題はありません。

(補正 "[" タイプミスは)

答えて

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) 
+0

おかげで、私は友人からその「辞書」シングを得ましたそれはbultinハッシュテーブルよりもはるかに高速です。私は数百メガバイトの "厚さ"であるいくつかのテーブルを持っています。私はあなたのソリューションを試し、フィードバックを与えます。 – cernoel

+0

'$ LoadTable'の例を教えてください。リストを一度に読み込むことで、スクリプトをスピードアップすることができます。 –

+0

:/いいえ、内部ERPデータが含まれています。それらは、たとえばShopItemの説明やものを保持しています。私は何をしていますか。その辞書を1日に1回ロードしてRAMに保持します。そのため、Dict LoadはSQL Serverから約10分を要します。しかし、私はそのDictに格納される前にいくつかのデータを変換または連結する必要があります。 – cernoel

0

あなたのパラメータに参照を削除し、次のようにタイプを置く:

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) 
+0

これで私は無効なデータエラー+ FullyQualifiedErrorId:ParameterArgumentTransformationErrorを持っています – cernoel

+0

私はこれを試しています、このコードの仕事。あなたは今、他の問題を抱えています。 – Esperento57

関連する問題