2010-11-11 27 views
7

J'ai quelques questions sur le sujet, des virgules par rapport à l'espace, dans les paramètres de délimitation.cmd- virgule pour séparer les paramètres Comparé à l'espace?

Ce sont des questions que les programmeurs C familiers avec l'invite cmd, peut être en mesure de jeter un peu de lumière sur ..

Je sais que lorsque vous faites

c:\>program a b c 

il y a 4 paramètres [0]=program[1]=a[2]=b[3]=c

Selon hh ntcmds.chm concepts ..

aperçu Shell

; and , are used to separate parameters 

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

Je vois dir a,b donne le même résultat que dir a b

mais

c:\>program a,b,c donne des paramètres [0] = programme [1] = a, b, c

Alors en faire? ou tout? les commandes windows utilisent; et , ? et est cette interprétation dans le code de chaque commande, ou fait par le shell comme avec l'espace?

Et si c'est dans le code de chaque commande .. comment saurais-je qui le faire? Je remarque que la documentation de explorer.exe mentionne la virgule, par exemple. vous pouvez le faire explorer /e,.

mais DIR /? ne le mentionne pas, mais peut l'utiliser. Et un programme c typique ne prend pas, en tant que délimiteur du tout .. Ainsi est-il le cas que le shell n'utilise pas de virgule pour délimiter, il utilise l'espace. Et les commandes de Windows qui le font, le font car elles sont écrites (toutes?) Pour délimiter les paramètres que le shell leur a donné quand les virgules sont utilisées?

Répondre

4

Il existe deux différences ici entre Unix et Windows:

  • commandes internes telles que DIR sont intégrés dans la coque; leur syntaxe de ligne de commande ne doit pas suivre les mêmes règles que pour les programmes ordinaires
  • Sous Windows, les programmes sont responsables de l'analyse de leurs propres lignes de commande. La coque parse réoriente et tuyaux, puis passe le reste de la ligne de commande au programme dans une chaîne

programmes C Windows construit en utilisant Visual Studio utiliser l'analyseur de ligne de commande dans le moteur d'exécution Microsoft C, qui est similaire à un analyseur de shell Unix typique et obéit à des espaces et des guillemets.

Je n'ai jamais vu un programme C qui utilise , ou ; comme séparateur de ligne de commande. J'étais au courant du cas spécial pour explorer /e,., mais je n'avais jamais vu l'exemple dir a,b jusqu'à maintenant.

+0

Comment pouvez-vous dire ce qui est fait par le shell, et ce qui est fait par le runtime MS C ou la lib standard? J'ai un Windows c prog avec juste #include En haut, et le code pour afficher argv. compilé avec gcc.I ne peut pas voir un moyen que je peux voir quel "paramétrage!" est fait à partir du shell et qui est automatique de la bibliothèque standard.Aussi, je remarque que la virgule ne fonctionne pas pour les programmes externes xcopy ou telnet. Je pense que je l'ai vu pour Rundll32. Je suppose que c'est juste un peu.Peut-être pas une fonction dans une bibliothèque disponible publiquement! Peut-être juste des programmes ext exceptionnels faisant cmd cmd.exe cmd.exe – barlop

+0

Tout est fait par l'exécution de MS C sauf la fonctionnalité du shell. La fonctionnalité Shell inclut des choses comme la redirection ('<', '>', etc. '>>'), la tuyauterie ('|'), le contrôle de flux ('&&' et '||') et l'échappement ('^'). Comme je l'ai dit, je n'ai jamais vu un programme utilisant ',' sur la ligne de commande, donc je ne suis pas surpris que cette copie et telnet ne le supportent pas. –

+0

suggérez-vous ms c runtime délimite espaces et citations? ou est-ce encore shell? et si c'est ms c runtime, pouvez-vous le prouver? Je ne vois pas comment votre deuxième point de balle distingue unix et le cos 'de windows ne serait pas un shell d'unix également d'analyser des redirections et des pipes. – barlop

0

Les fichiers batch utilisent une virgule ou un point-virgule comme séparateur d'argument alternatif.

fichier batch de test:

@echo %1/%2/%3 

Essai de fonctionnement:

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

Et, comme vous le notez, dir utilise, copy aussi bien - ce sont les deux Encastrements shell et fonctionnent probablement par un analyseur similaire à celui des fichiers batch aussi bien (ce n'est pas exactement la même chose, puisque vous pouvez faire des choses comme cd.. ou dir/s qui ne sont pas possibles pour autre chose). Je suppose (remarque: spéculation) que c'est une sorte de rétrocompatibilité qui remonte aux jours DOS ou même CP/M. De nos jours, vous devriez probablement utiliser des espaces. Et comme le note Tim, le runtime C dicte certaines choses sur les arguments et comment ils sont censés être analysés. Beaucoup d'autres langues/cadres suivent cette convention mais pas nécessairement tous. PowerShell par exemple a une gestion des arguments complètement différente et cela peut parfois être une surprise lorsque vous interagissez avec des programmes natifs à l'intérieur de celui-ci (cela dit, les cmdlets et fonctions PowerShell ne sont pas des programmes exécutables ailleurs, mais des fichiers batch).

+1

vous avez écrit "Les applets de commande et les fonctions de PowerShell ne sont pas des programmes exécutables ailleurs, mais des fichiers batch de la même manière" devrait-il être un non, et le but, supprimé? les fichiers batch comme vous le dites, ne peuvent pas être exécutés à partir de PowerShell, donc je ne vois pas pourquoi il y a un 'mais' là. – barlop