.Net命令行args问题

时间:2011-06-16 21:16:27

标签: c# .net command-line command-line-arguments

我有一个.net / c#命令行应用程序,它采用以下格式的几个参数:

some.exe -p1: value -p2: someothervalue

完整的示例调用如下所示:

JobWorker.exe -j:b38815af-68ce-4cb9-a858-3c016cc3c033 -cs:fors37ca -ch:384 
-s:fors37ea -dp:667 -op:B:\ 
-ci:"d:\TFS\iRMA-4.2-P1\Applications.JobExecutor\bin\x86\Debug\Image Cache\" 
-cas:fors35fa -cap:333 -gs:fors395a -gb:gibraltar -gt:5 
-jn:"DocumentJob #iRMA FSP #Some User Name #Open #6/16/2011"

现在由于某种原因-ci:“d:....”部分打破了字符串[] args奇怪,请参阅-ci:one:

full command line including the -ci: part

vs没有: command line without the -ci: part

过去-ci:部分的一切都搞砸了...出于某种原因&我想知道它是什么?有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我认为liho1eye在评论中说得对。

这与.NET无关,而是与您使用什么方法将args传递给程序有关。

您是从CMD.exe shell运行它吗?

解决方法是要么删除尾随反斜杠,要么加倍,如下所示:

-ci:"d:\TFS\iRMA-4.2-P1\Applications.JobExecutor\bin\x86\Debug\Image Cache\\" 

答案 1 :(得分:0)

Per msdn

以反斜杠(\“)开头的双引号被解释为文字双引号字符(”)

http://msdn.microsoft.com/en-us/library/78f4aasd(v=vs.80).aspx

它将其视为文字并且不会关闭参数。

答案 2 :(得分:0)

你有一个非常复杂的命令行,需要很多参数,它可能是以编程方式生成的(我希望如此。)因为它很复杂并且你需要允许麻烦的字符然后我会建议传递一个, base64编码的块作为包含所有参数信息的参数。它是一种穷人的序列化程序,但它保护你的命令免受通过命令行传递args和管道和角括号等十几个特殊字符所带来的许多怪异: < >和其他几个人。您可以解码并解析逻辑中的base64块,而无需担心特殊字符。

因此,使用base64编码,您的命令将如下所示:

  

JobWorker.exe   LWo6YjM4ODE1YWYtNjhjZS00Y2I5LWE4NTgtM2MwMTZjYzNjMDMzIC1jczpmb3JzMzdjYSAtY2g6Mzg0IA0KLXM6Zm9yczM3ZWEgLWRwOjY2NyAtb3A6QjpcIA0KLWNpOiJkOlxURlNcaVJNQS00LjItUDFcQXBwbGljYXRpb25zLkpvYkV4ZWN1dG9yXGJpblx4ODZcRGVidWdcSW1hZ2UgQ2FjaGVcIiANCi1jYXM6Zm9yczM1ZmEgLWNhcDozMzMgLWdzOmZvcnMzOTVhIC1nYjpnaWJyYWx0YXIgLWd0OjUgDQotam46IkRvY3VtZW50Sm9iICNpUk1BIEZTUCAjU29tZSBVc2VyIE5hbWUgI09wZW4gIzYvMTYvMjAxMSI =

您可以verify the en/decoding here以及许多其他在线位置。