Übergeben integer-array als Kommandozeilen-argument powershell-Skript

Habe ich das folgende powershell-Skript:

param (
  [Parameter(Mandatory=$true)][int[]]$Ports
)

Write-Host $Ports.count

foreach($port in $Ports) {
 Write-Host `n$port
}

Wenn ich das Skript mit $ powershell -File ./test1.ps1 -Ports 1,2,3,4 es funktioniert (aber nicht wie erwartet):

1

1234

Wenn ich versuche, mit größeren zahlen $ powershell -File .\test.ps1 -Ports 1,2,3,4,5,6,10,11,12, das Skript bricht ganz:

test.ps1 : Cannot process argument transformation on parameter 'Ports'. Cannot convert value "1,2,3,4,5,6,10,11,12" to type "System.Int32[]". Error: "Cannot convert value "1,2,3,4,5,6,10,11,12" to type "System.Int32". Error: "Input
string was not in a correct format.""
    + CategoryInfo          : InvalidData: (:) [test.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1

Scheint es, wie powershell zu verarbeiten versucht, die zahlen weitergegeben über die Ports param als eine einzelne Zahl, aber ich bin mir nicht sicher, warum dies geschieht, oder wie man in der Vergangenheit es.

  • Dies ist wahrscheinlich aufgrund zu analysieren, durch was auch immer analysieren Ihre powershell Befehlszeile. Wenn Sie die Ausführung Ihres Skripts (oder einer Funktion) aus der PowerShell-Eingabeaufforderung, es sollte funktionieren wie erwartet.
  • Wenn ich mich richtig erinnere, -file nicht wie argument-arrays. -command besser funktioniert. Tut powershell -Command "& .\test.ps1 -Ports 1,2,3,4,5,6,10,11,12" arbeiten, wie Sie wollen?
  • Scheint lauffähige PoSh V 6.0.0 beta auf Linux/OSX @BenHs Tipp funktioniert es einwandfrei.
InformationsquelleAutor Jared | 2017-08-02



One Reply
  1. 3

    Das Problem ist, dass ein parameter übergeben, durch powershell.exe -File ist ein [string].

    Also für dein erstes Beispiel,

    powershell -File ./test1.ps1 -Ports 1,2,3,4

    $Ports übergeben [string]'1,2,3,4' denen dann versucht wird, gecastet [int[]]. Sie können sehen, was passiert mit:

    [int[]]'1,2,3,4'
    1234

    Wissen, dass es eine nur eine regelmäßige [int32] mit dem Komma entfernt bedeutet, dass das casting 1,2,3,4,5,6,10,11,12 zu groß für [int32] wodurch Sie Ihre Fehler.

    [int[]]'123456101112'

    Nicht konvertieren kann der Wert „123456101112“ in den Typ „System.Int32[]“. Fehler: „Cannot convert value „123456101112“ in den Typ „System.Int32“. Fehler: „der Wert wurde entweder zu
    groß oder zu klein für ein Int32.““


    Weiterhin mit -file könnte man Parsen der string sich durch die Aufteilung auf Kommas.

    param (
        [Parameter(Mandatory=$true)]
        $Ports
    )
    
    $PortIntArray = [int[]]($Ports -split ',')
    
    $PortIntArray.count    
    
    foreach ($port in $PortIntArray ) {
        Write-Host `n$port
    }

    Aber das ist zum Glück unnötig, denn es gibt auch powershell.exe -command. Sie können rufen Sie das Skript und verwenden Sie die PowerShell-Modul zum Parsen der Argumente. Wäre dies richtig sehen, die Port parameter als ein array.

    powershell -Command "& .\test.ps1 -Ports 1,2,3,4,5,6,10,11,12"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.