命令行开关从可执行文件的路径中解析出来

时间:2010-02-26 00:54:52

标签: windows command-line-arguments

为什么Windows程序会将命令行开关解析出可执行文件的路径? (后者通常称为argv[0]。)

例如,xcopy

C:\Temp\foo>c:/windows/system32/xcopy.exe /f /r /i /d /y * ..\bar\
Invalid number of parameters

C:\Temp\foo>c:\windows\system32\xcopy.exe /f /r /i /d /y * ..\bar\
C:\Temp\foo\blah -> C:\Temp\bar\blah
1 File(s) copied

我应该在自己的程序中遵循什么行为?

是否有许多用户希望在没有空格的情况下键入命令行开关(例如program/?而不是program /?),我是否应该尝试支持此功能,或者我应该只报告错误和立即退出?

我需要注意哪些其他警告? (除了Anon。下面的评论,“debug / program”从PATH运行debug.exe,即使“debug \ program.exe”存在。)

3 个答案:

答案 0 :(得分:2)

我认为这实际上是DOS shell执行此操作:

我的理解是DOS选择使用正斜杠(/)作为命令行选项(即“DIR / s”),甚至在DOS支持的子目录之前。后来,在他们引入子目录的时候,他们意识到他们不能使用正斜杠作为路径分隔符(就像UNIX上的标准一样),所以他们不得不使用反斜杠。

另外一个因素是DOS不需要命令名和第一个参数之间的空格。 (即,“CD”与“CD”相同。)

由于上述原因,我猜测它不是“错误地”解析命令行的程序 - 而是 DOS shell 使用“C:”作为可执行文件/命令名,其余作为命令行参数。 (当然,一个相当测试的应用程序可以验证这一点,但我现在远离我的编译器。)

答案 1 :(得分:0)

我希望执行此操作的任何程序都使用GetCommandLine()而不是argv[]来访问命令行参数,并且无法考虑/和{{1}的可替代性在Windows上的用户模式路径中。

答案 2 :(得分:0)

我有一些建议可能会有所帮助。这些是我为处理参数和开关而制作(和使用)的类的结果。

  • 我检查参数数组,看看哪个分隔符用于路径,哪个分隔符用于开关/参数。

  • 我个人区分开关和参数,使用一个斜线和一个连字符。

  • 如果传递的开关与任何预期的参数或开关都不匹配,我会检查是否只有一个斜线传递多个开关。如果用户输入错误内容,则会导致用户更多问题。例如,如果我正在寻找/ d / e / l -or- / del SomeThing和用户输入/ del,目的是传递d e和l开关。

  • 在对象中,我将开关填充到std :: container中,并将参数和参数值填入另一个std :: container中,然后使消费者应用程序可以根据需要进行处理。