2016-12-03 5 views
0

私はこの単純なPowerShellのプログラムPowerShellの入力配管問題

[int]$st1 = $input[0] 
[int]$st2 = $input[1] 
[int]$st3 = $input[2] 
[int]$pm = $input[3] 
[int]$cm = $input[4] 

$MedMarks = $st1 + $st2 + $st3 - ($pm + $cm) 
Write-Host "Med Marks $MedMarks" 

を実行することはできませんよ、私はこの

120、130、90、45、30のような入力パイプラインでそれを実行しようとしています| 。\ sample_program.ps1

私は一貫してあなたがそのような$inputへのインデックスすることはできません。このエラーに

Cannot convert the "System.Collections.ArrayList+ArrayListEnumeratorSimple" value of type 
"System.Collections.ArrayList+ArrayListEnumeratorSimple" to type "System.Int32". 
+1

'$ InputArray = @($入力); [int] $ st1 = $ InputArray [0]; ... ' – PetSerAl

+0

@PetSerAl ...これは正しいですが、なぜコメントに? :)私はそれを正しくマークすることができるように答えて移動してください:) –

答えて

1

をあなたはこのよう$inputを検査した場合その$inputはコレクションではなく、1つの列挙子です。だから、裸のインデクサーでランダムアクセスはありません$input。あなたが本当にインデックス$inputにしたい場合は、配列や他のいくつかのコレクションにその内容をコピーする必要があります。その後、

$InputArray = @($input) 

することができます通常のようにインデックス$InputArray

[int]$st1 = $InputArray[0] 
[int]$st2 = $InputArray[1] 
[int]$st3 = $InputArray[2] 
[int]$pm = $InputArray[3] 
[int]$cm = $InputArray[4] 
3

を取得しています。

あなたはForEach-Objectを利用することができます

$st1,$st2,$st3,$pm,$cm = $input |ForEach-Object { $_ -as [int] } 

または(好ましくは)、使用名前付きパラメータ:

PS> function f { $input.GetType().FullName } f 
System.Collections.ArrayList+ArrayListEnumeratorSimple 

、あなたは気づくことができます。

param(
    [int]$st1, 
    [int]$st2, 
    [int]$st3, 
    [int]$pm, 
    [int]$cm 
) 

$MedMarks = $st1 + $st2 + $st3 - ($pm + $cm) 
Write-Host "Med Marks $MedMarks" 
+0

これは動作しますが、私は@PetSalAlの応答、少しきちんとした –