cmd- запятая для разделения параметров по сравнению с пробелом? - PullRequest
7 голосов
/ 11 ноября 2010

У меня есть несколько вопросов по теме, запятым по сравнению с пробелом в разделении параметров.

Это вопросы, на которые программисты C, знакомые с приглашением cmd, могут пролить свет ...

Я знаю, что при выполнении

c:\>program a b c

есть 4 параметра [0]=program [1]=a [2]=b [3]=c

Согласно hh ntcmds.chm понятиям ..

Обзор оболочки

; and , are used to separate parameters

; or , command1 parameter1;parameter2  Use to separate command parameters.

Я вижу, dir a,b дает тот же результат, что и dir a b

, но

c:\>program a,b,c дает параметры [0]= программа [1] = a, b, c

Так что же?или все?использование команд windows;а также , ?и это интерпретация в коде каждой команды, или выполняется оболочкой, как с пробелом?

И если это в коде каждой команды ... как бы я узнал, что это делает?Я заметил, что в документации к explorer.exe упоминается запятая, например, вы можете сделать explorer /e,.

, но DIR /?не упоминает об этом, но может использовать это.И типичная программа на c вообще не воспринимает это как разделитель. Так же и в случае, когда оболочка не использует запятую для разделения, она использует пробел.И команды Windows, которые делают, делают это, потому что они (все?) Написаны для разграничения параметров, которые оболочка дала им далее, когда используются запятые?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010

Здесь есть два различия между Unix и Windows:

  • Внутренние команды, такие как DIR, встроены в оболочку;их синтаксис командной строки не должен следовать тем же правилам, что и для обычных программ
  • В Windows программы отвечают за синтаксический анализ своих собственных командных строк.Оболочка анализирует перенаправления и каналы, затем передает остальную часть командной строки программе в одну строку

Программы Windows C, созданные с использованием Visual Studio, используют анализатор командной строки во время выполнения Microsoft C, котороепохож на обычный синтаксический анализатор оболочки Unix и подчиняется пробелам и кавычкам.

Я никогда не видел C-программу, которая использует , или ; в качестве разделителя командной строки.Я знал о специальном случае для explorer /e,., но я никогда не видел пример dir a,b до сих пор.

0 голосов
/ 11 ноября 2010

Пакетные файлы используют запятую или точку с запятой в качестве альтернативного разделителя аргументов.

Тестовый пакетный файл:

@echo %1/%2/%3

Тестовый прогон:

> test.cmd 1,2,3
1/2/3
> test.cmd 1;2 3
1/2/3

И, как вы заметили, dir также использует copy - они оба встроены в оболочку и, вероятно, также запускаются через похожий парсер, такой как командные файлы (это не совсем то же самое, поскольку вы можете делать такие вещи, как cd.. или dir/s, которые невозможны ни для чего другого). Я предполагаю (примечание: предположение), что это какая-то обратная совместимость, которая восходит к DOS или даже дням CP / M. В настоящее время вы, вероятно, должны просто использовать пробелы. И, как отмечает Тим, среда выполнения C диктует определенные вещи об аргументах и ​​о том, как они должны анализироваться. Многие другие языки / рамки следуют этому соглашению, но не обязательно всем. Например, PowerShell имеет совершенно иную обработку аргументов, и иногда это может быть неожиданностью при взаимодействии с собственными программами изнутри (то есть командлеты и функции PowerShell не являются программами, выполняемыми в других местах, но также и пакетными файлами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...