如何忽略命令行参数中的转义字符?
How do I ignore escape characters in command line arguments?
考虑一个简单的 F# 控制台应用程序,它回显传递给它的命令行参数,每行一个命令:
[<EntryPoint>]
let main argv =
argv |> Array.iter (printfn "%s")
0
如果我向该程序传递一个带有尾部斜杠的目录路径,它会将斜杠视为转义字符,从而产生意外结果:
> app.exe "c:\some path\" "c:\another path"
c:\some path" c:\another
path
如何在不将斜杠解释为转义字符的情况下检索命令行参数?
System.Environment.CommandLine
使您可以访问完整的未转义命令行,并且您可以随意处理它。
但是除非您计划在您的应用中实现一个成熟的解析器,否则这不是一个可靠的方法,并且您不太可能能够可靠地处理所有由所有实现的拜占庭转义规则您的应用程序可能已被调用的各种 shell。例如cmd.exe
与 powershell.exe
的转义方式不同,而 powershell.exe
又不同于 Cygwin 等
更好的选择是简单地按原样使用 argv
,按照您认为合适的方式对其进行验证(例如 File.Exists(argv.[0])
或其他),如果用户搞砸了,则使用有用的错误消息来解决问题有事。
考虑一个简单的 F# 控制台应用程序,它回显传递给它的命令行参数,每行一个命令:
[<EntryPoint>]
let main argv =
argv |> Array.iter (printfn "%s")
0
如果我向该程序传递一个带有尾部斜杠的目录路径,它会将斜杠视为转义字符,从而产生意外结果:
> app.exe "c:\some path\" "c:\another path"
c:\some path" c:\another
path
如何在不将斜杠解释为转义字符的情况下检索命令行参数?
System.Environment.CommandLine
使您可以访问完整的未转义命令行,并且您可以随意处理它。
但是除非您计划在您的应用中实现一个成熟的解析器,否则这不是一个可靠的方法,并且您不太可能能够可靠地处理所有由所有实现的拜占庭转义规则您的应用程序可能已被调用的各种 shell。例如cmd.exe
与 powershell.exe
的转义方式不同,而 powershell.exe
又不同于 Cygwin 等
更好的选择是简单地按原样使用 argv
,按照您认为合适的方式对其进行验证(例如 File.Exists(argv.[0])
或其他),如果用户搞砸了,则使用有用的错误消息来解决问题有事。