2016-06-27 3 views
-4

мне нужно, чтобы получить 3 параметра из командной коровьим (CMD) я писал и получил сообщение об ошибке:F # синтаксического анализа команд аргументы командной строки

[<EntryPoint>] 
let main(args) = 

    printfn "args: %A" args.[0] 
    let xmlP = args.[0] 
    let excelFormatP = args.[1] 
    let excelP = args.[2] 

    printfn "%A" (functionParseXmlToExcel(xmlP , excelFormatP , excelP)) |> ignore 

    0 

Я понимаю, что мне нужно разобрать параметры (3 строки) ,

ошибки я получил, когда я пытаюсь запустить его из командной строки с 3 дорожками файлов: Индекс находился вне границ массива ...

Может кто-нибудь помочь мне с этим ??

Благодаря

+6

Какая у вас ошибка? –

+1

Спасибо: Unhandlad Исключение: System.IndexOutOfRangeException: Индекс находился за пределами массива ... (- Ошибка в cmd) – MRah

+7

Это похоже на получение крови из камня: по какой строке ошибка, и как вы запускаете код? - если вы не предоставите нам достаточно информации, чтобы увидеть проблему, как ее исправить? –

ответ

7

С вашей вставленной командной строки, это очень похоже, вы забыли добавить пробел между вторым и третьим путем в командной строке - у вас есть два "" прямо рядом друг с другом. Вы должны также заметить, что, при печати из первого аргумента args.[0], вы видите два пути каскадных кодов с помощью одного "

As для создания вашего кода более надежным: Доступ к элементам массива без предварительной проверки длины массива является плохим идея, независимо от языка. F # предоставляет вам отличный способ сделать как проверка длины и доступ элемента в одном махом, с помощью поиска по шаблону массив:

match args with 
| [| xmlP; excelFormatP; excelP |] -> 
    let result = functionParseXmlToExcel(xmlP , excelFormatP , excelP) 
    printfn "Completed with %A" result 
    0 
| _ -> 
    failwithf "Expected 3 commandline arguments, but got %i arguments" args.Length 

я настоятельно рекомендую прочитать на pattern matching in general - Скотт справедливо называет это «рабочая лошадка F #».

3

Вам нужно убедиться, сколько параметров вы передаете, и как вы их разбираете, а затем как функция, которую вы вызываете, ожидает получить. Поэтому неплохо было бы показать подпись функции для functionParseXmlToExcel. Ниже очень простой пример:

let myExcelFunction(param1,param2,param3) = 
    printfn "%A" param1 
    printfn "%A" param2 
    printfn "%A" param3 


[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 

    let parseParams (argv:string []) = 
     let param1,param2,param3 = argv.[0],argv.[1],argv.[2] 
     myExcelFunction(param1,param2,param3) 

    match argv.Length with 
     | 3 -> parseParams argv |> ignore 
     | _ -> failwith "You need to pass three parameters!" 
    0 // return an integer exit code 

Для более полного решения, которое вы могли бы исследовать Argu.

Смежные вопросы