2016-06-27 163 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个pathes运行错误:指数数组的边界之外...

有人能帮助我吗?

感谢

+6

你有什么错误? –

+1

谢谢你:Unhandlad异常:System.IndexOutOfRangeException:索引超出了数组的范围......( - 在cmd中的错误) – MRah

+7

这就像从石头上获取血液:在哪一行是错误,以及如何你运行的代码? - 如果您没有提供足够的信息来查看问题,我们该如何解决? –

回答

7

从粘贴的命令行,这非常看起来你忘了在命令行上你的第二个和第三个路径之间添加一个空格 - 你有两个""紧挨着对方。你也应该注意到的是,打印出的第一个参数args.[0]时,你看到的,让你的代码更健壮由单一"

由于级联两条路径:访问数组元素,而无需首先检查数组的长度是一个坏想法,无论语言是什么。 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一个更完整的解决方案。