2016-12-03 1 views
0

ich nicht in der Lage bin, dieses einfache Powershell-ProgrammPowershell Eingangsleitungen Ausgabe

[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" 

ich es mit Eingang Pipelines wie diese

120, 130, 90, 45, 30 zu laufen versuchen laufen | . \ Sample_program.ps1

ich diesen Fehler konsequent bin immer

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

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

+0

@PetSerAl ... das ist richtig, aber warum in Kommentaren? :) bitte verschiebe es um zu antworten damit ich es richtig markieren kann :) –

Antwort

1

Wenn Sie $input wie folgt überprüfen:

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

dann können Sie feststellen, , dass $input keine Sammlung, sondern ein Enumerator für einen ist. Also, Sie haben keinen wahlfreien Zugriff mit Indexer für bare $input. Wenn Sie wirklich $input indizieren möchten, dann müssen Sie seinen Inhalt in ein Array oder eine andere Sammlung kopieren:

$InputArray = @($input) 

dann können Sie Index $InputArray als normal:

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

Sie können nicht Index in $input dass dergleichen.

Sie können ForEach-Object nutzen:

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

oder (vorzugsweise), Verwendung benannte Parameter:

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

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

Das funktioniert, aber ich werde mit @PetSalAl's Antwort gehen, es ist ein bisschen ordentlich –