Ключи командной строки анализируются вне пути исполняемого файла - PullRequest
0 голосов
/ 26 февраля 2010

Почему программы 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» запускает debug.exe из PATH, даже если существует «debug \ program.exe».)

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Я думаю, что это на самом деле оболочка DOS делает это:

Насколько я понимаю, DOS решил использовать косую черту (/) для параметров командной строки (т. Е. "DIR / s"), даже до того, как DOS поддерживал подкаталоги . Позже, когда они представили подкаталоги, они поняли, что не могут использовать прямую косую черту в качестве разделителя пути (как это было в стандарте в UNIX), поэтому вместо них пришлось использовать обратную косую черту.

Также фактором является то, что DOS не требует пробела между именем команды и первым параметром. (То есть, "CD \" - это то же самое, что и "CD \".)

Исходя из вышесказанного, я предполагаю, что не программа неправильно анализирует командную строку - вместо этого оболочка DOS , использующая "C:" в качестве имя исполняемого файла / команды, а остальное в качестве аргумента (ов) командной строки. (Конечно, довольно тестовое приложение могло бы это проверить, но сейчас я не в курсе своего компилятора.)

0 голосов
/ 26 февраля 2010

У меня есть пара предложений, которые могут помочь. Это результат класса, который я создал (и использую) только для обработки параметров и переключателей.

  • Я проверяю массив аргументов, чтобы увидеть, какой разделитель используется для пути, а какой используется для переключателей / параметров.

  • Я лично различаю переключатели и параметры, используя косую черту для одного и дефис для другого.

  • Если передан переключатель, который не соответствует ни одному из ожидаемых параметров или переключателей, я проверяю, было ли передано несколько переключателей только с одним слешем. Это вызвало и вызовет больше проблем для пользователей, если они что-то неправильно наберут. Например, если я искал / d / e / l -или- / del SomeThing и пользователь вводил / del с намерением передать переключатели d e и l.

  • В объекте я помещаю переключатели в std :: container, а параметры и значения параметров в другой std :: container, которые затем предоставляются приложению-потребителю для обработки по своему усмотрению.

0 голосов
/ 26 февраля 2010

Я ожидаю, что любая программа, делающая это, будет использовать GetCommandLine() вместо argv[] для доступа к аргументам командной строки и не сможет учесть функциональность / и \ в путях пользовательского режима в Windows .

...