none
PowerShell自作Functionの戻り値の型について RRS feed

  • 質問

  • お世話になります、小嶋と申します。

    【環境】
    OS:Windows Server 2008 R2 /Windows 7 Ultimata
    PowerShell 2.0

    【内容】
    自作したFunctionの戻り値の型について。
    現在、Function内でSystem.Collections.Generic.Dictionaryのインスタンスを作成し、
    return しています。
    しかし、その戻り値がオブジェクトの配列になってしまう、
    という事象が発生したりしなかったりしています。


    ①発生する例:(iniファイルを、Dictionaryの入れ子に読み込む処理)

    function Read-IniFile
    {
    	process
    	{
    		$iniSectionType = 'Collections.Generic.Dictionary[String, String]';
    		$iniFileType = "Collections.Generic.Dictionary[String, $iniSectionType]";
    		$iniFile = New-Object $iniFileType;
    		$iniSection;
    		$sectionName = '';
    
    		#$contents = Get-Content -Path $iniPath;
    		$contents = Get-Content -Path "D:\zi54u2jf.4if";
    		foreach ($line in $contents)
    		{
    			if (([String]$line).Trim().StartsWith(";"))
    			{
    				# コメント
    				continue;
    			}
    			elseif (([String]$line).Trim().StartsWith("[") -and ([String]$line).Trim().EndsWith("]"))
    			{
    				# セクション行
    				$iniSection = New-Object $iniSectionType;
    				$sectionName = $line.Trim().SubString(1, $line.Length - 2);
    				$iniFile.Add($sectionName, $iniSection) | Out-Null;
    			}
    			else
    			{
    				$keyValuePair = ([String]$line).Split('=');
    				if ($keyValuePair.Length -eq 2)
    				{
    					$key = $keyValuePair[0].Trim();
    					$value = $keyValuePair[1].Trim();
    					if ($value.StartsWith('"') -and $value.EndsWith('"'))
    					{
    						$value = $value.SubString(1, $value.Length - 2);
    	
    					}
    					$iniFile[$sectionName].Add($key, $value) | Out-Null;
    				}
    			}
    		}
    		
    		return $iniFile;
    	}
    }
    ②発生しない例:(上記を検証するために作成したミニマムコード)

    function Get-Dictionary
    {
    	process
    	{
    		$type1 = 'System.Collections.Generic.Dictionary[String, String]';
    		$type2 = "System.Collections.Generic.Dictionary[String, $type1]";
    		$dic = New-Object $type2;
    		
    		$dic.Add("a", (New-Object $type1));
    		$dic.Add("b", (New-Object $type1));
    		
    		$dic["a"].Add("1", "AA");
    		$dic["a"].Add("2", "BB");
    		
    		$dic["b"].Add("3", "XX");
    		$dic["b"].Add("4", "YY");
    		
    		return $dic;
    	}
    }
    それぞれで実行している内容に違いはない、という認識なのですが、
    ②ではDictionaryの型がそのまま呼び元に返り、
    ①では、Nullと作成したDictionaryの2要素が格納された配列が返ります。

    おそらくPowerShellの基本的な仕様に関係すると推測していますが、
    なぜこのような違いが出るのでしょうか・・・
    ヒントになるサイト等なんでもかまいませんので、
    ご教授いただけると助かります。

    よろしくお願いします。
    2012年6月18日 6:25

回答