4

我正在尝试将文件路径传递给 a C# Console Application,但在字符串到达​​控制台应用程序时遇到了不正确的问题。

如果我使用文件路径参数从命令行运行我的应用程序:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\"

弹出一个窗口对话框并通知我我的应用程序已停止工作,当我单击 Debug 选项时,我可以看到结果args[0]是:

C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject"

请注意,最后仍然有一个尾随引号。

如果我传递第二个参数:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\" "any old string"

我再次收到错误,在调试中查看后,我看到 args[0] 是:

C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject" 任何

我很困惑为什么会这样。我唯一的猜测是字符串中的反斜杠导致字符串中的某种转义序列?编辑:我注意到上面的字符串示例中也发生了同样的事情!似乎 \" 在这里引起了问题。

我只想传入当前解决方案目录的文件路径,并使用 $(SolutionDir) 从预构建事件中调用我的应用程序,并且知道我可以通过其他方式获取当前解决方案的路径。但这是最简单的,我很好奇为什么它不能按预期工作。

4

4 回答 4

5

是的,命令行参数的规则有点模糊。

\转义字符,您可以使用它来转义引号 ( ")。您必须转义反斜杠,但前提是它位于引号之前。所以使用(注意最后的'\\'):

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\\" 

或者,更简单,但你必须以某种方式在 C# 中处理它:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject" 

也看到这个问题

于 2013-07-24T09:57:45.420 回答
1

这就是为什么/在路径中使用总是更好的原因

"C:/Users/DevDave/Documents/Visual Studio 2012/Projects/MyProject/" "any old string"

看看:http://en.wikipedia.org/wiki/Path_(computing),你可以同时使用\/在 path 但是如果你想要任何 shell 兼容性我建议使用/

于 2013-07-24T10:04:06.267 回答
1

MyApp 之后的任何内容都将是第一个参数 (args[0])。在您的情况下,第一个参数是"C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\". 此外,字符串末尾的引号似乎会发生,因为这\"意味着您想要转义引号并将其写为字符串。在这种情况下,引号不会关闭字符串。这就是你的 args[0] 是后面的全部的原因MyApp

如果您不想转义引号并在其后面加上斜线,则应该这样做\\"

你可以试试这个并告诉我会发生什么:

MyApp "C:\Users\DevDave\Documents\Visual Studio 2012\Projects\MyProject\\"

(看双斜线)

希望能帮助到你。

于 2013-07-24T10:06:36.287 回答
0

继续 Henk 的回答,并选择\在路径末尾添加 a,然后:

如果您选择通过在 Henk 的回答中选择此代码来破解错误(“更简单,但您必须以某种方式在 C# 中处理它:”),那么您应该意识到会发生一些错误:

  1. args[0] 只会被设置,即使您传入多个参数。args 的长度将等于 1。因此您必须将 args[0] 拆分为多个部分以进行破解。

  2. 如果它们位于您拆分的部分的末尾,您必须用 a 替换任何"字符。\

于 2016-01-17T22:11:48.707 回答