代码之家  ›  专栏  ›  技术社区  ›  Roger Pate

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

  •  0
  • Roger Pate  · 技术社区  · 15 年前

    为什么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.的评论之外,“调试/程序”即使在“调试\程序.exe”存在的情况下也可以从路径运行Debug .exe。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Eric Pi    15 年前

    我想实际上是DOS外壳在做这个:

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

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

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

        2
  •  0
  •   Max Rible Kaehn    15 年前

    我希望任何这样做的程序 GetCommandLine() 而不是 argv[] 访问命令行参数,但未能考虑 / \ 在Windows上的用户模式路径中。

        3
  •  0
  •   ISDi    15 年前

    我有几个建议可能会有帮助。这是我创建(并使用)的一个类的结果,该类仅用于处理参数和开关。

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

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

    • 如果传递的开关与任何预期参数或开关都不匹配,我将检查传递的多个开关是否只有一个斜杠。如果用户错误地输入了某些内容,这会给用户带来更多的问题。例如,如果我在寻找/d/e/l-或-/del某物,而用户输入/del的目的是传递d e和l开关。

    • 在对象中,我将开关填充到std::容器中,将参数和参数值填充到另一个std::容器中,然后让使用者应用程序根据需要处理这些参数和参数值。