为什么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”存在。)
答案 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中,然后使消费者应用程序可以根据需要进行处理。