2017-01-26 10 views
0

私はこの機能をかなり正しくすることはできません。私はそれをオブジェクトを渡したいとオブジェクトが空の場合、1を返し、それ以外の1空のパイプをパイプすると、1のカウントがあります

によってオブジェクトと増分内の項目を数える「新・テスト」次の関数を仮定:

function New-Test 
{ 
    [cmdletbinding()] 
    Param 
    (
     [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] 
     [object[]]$Object 
     #[object]$object 
    ) 
    Begin 
    { 
     [email protected]()  
    } 
    Process 
    { 
     "Total objects: $($object.count)" 
     if($Object.count -gt 0) 
     { 
      $oData += [pscustomobject]@{ 
       Name = $_.Name 
       Value = $_.Value 
      }  
     } 
     Else 
     { 
      Write-Verbose "No existing object to increment. Assuming first entry." 
      $oData = [pscustomobject]@{Value = 0} 
     } 
    } 
    End 
    { 
     $LatestName = ($oData | Sort-Object -Descending -Property Value | Select -First 1).value 
     [int]$intNum = [convert]::ToInt32($LatestName, 10) 
     $NextNumber = "{0:00}" -f ($intNum+1) 
     $NextNumber 
    } 
} 

そして、次のテストハッシュテーブル:上記の機能を1として

#Create test hashtable: 
$a = 00..08 
$obj = @() 
$a | foreach-object{ 
    $obj +=[pscustomobject]@{ 
     Name = "TestSting" + "{0:00}" -f $_ 
     Value = "{0:00}" -f $_ 
    } 
} 

、私は$ OBJのそれを渡した場合、私が取得:

$obj | New-Test -Verbose 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
Total objects: 1 
09 

期待どおりです。しかし、私は$ obj2はそれを渡す場合:

#Create empty hash 
$obj2 = $null 
$obj2 = @{} 

$obj2 | New-Test -Verbose 

私が手:$ object.countが1である理由

Total objects: 1 
Exception calling "ToInt32" with "2" argument(s): "Index was out of range.  Must be non-negative and less than the size of the collection. 
Parameter name: startIndex" 
At line:33 char:9 
+   [int]$intNum = [convert]::ToInt32($LatestName, 10) 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : ArgumentOutOfRangeException 

01 

が、私は理解していない、ハッシュテーブルでは何もありませんとき。

私は空のハッシュテーブルテストの結果、[オブジェクト[]]、[オブジェクト]から、パラメータ、$オブジェクトの種類を変更する場合:

私ならば、私は、しかし、期待するものである
$obj2 | New-Test -Verbose 
Total objects: 0 
VERBOSE: No existing object to increment. Assuming first entry. 
01 

最初のテストを実行すると、結果は次のようになります。

$obj | New-Test -Verbose 
Total objects: 
VERBOSE: No existing object to increment. Assuming first entry. 
Total objects: 
VERBOSE: No existing object to increment. Assuming first entry. 

今回は$オブジェクトに何も含まれていません。

私はそれが簡単だと確信していますが、私はこのことを理解できません。どんな助けもありがとうございます。

P.S. PowerShell 5.1

+0

$ obj1が初期化されている配列ではなく、$ obj2にハッシュテーブルを割り当てていることがわかりました。 –

+0

あなたはいつも 'measure-object'を使って関数のカウントを直接見ることができます。 'New-Test | Run 'を実行すると、結果は2になります。 Measure-Object'を実行します。 –

答えて

2

$obj2は、配列ではなくハッシュテーブルです。ハッシュテーブルはデフォルトで列挙されていないので、ハッシュテーブル自体が1つのオブジェクトです。パイプラインを使用してハッシュテーブルをループする場合は、$obj2.GetEnumerator()を使用する必要があります。

@{"hello"="world";"foo"="bar"} | Measure-Object | Select-Object Count 

Count 
----- 
    1 

@{"hello"="world";"foo"="bar"}.GetEnumerator() | Measure-Object | Select-Object Count 

Count 
----- 
    2 
関連する問題