2017-05-24 2 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"메서드를 찾을 수 없습니다.

함수를 호출하지 않고 함수 코드를 Main에 사용하면 문제가 없습니다.

(보정 "["오타)

답변

0

대답은 아니오 이다. 개체를 다시 정의 할 필요는 없습니다.

Esperento57에서 언급 한 것처럼 if 조건에 [이 있습니다. 당신의 매개 변수에

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 설명 및 물건을 보유하고 있습니다. 내가하는 일은 하루에 한 번 해당 사전을로드하고 RAM에 보관하는 것입니다. 따라서 Dict Load는 SQL Server에서 약 10 분이 소요됩니다. 실제로는 지옥이 빠릅니다. 하지만 변환 또는 일부 Dict에 저장되기 전에 데이터를 연결해야합니다. – cernoel

0

제거 심판과 같은 유형을 넣어 : 어쨌든, 당신이 bultin 해시 테이블를 사용하여 고려할 수,

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