2010-11-11 32 views
7

Tengo algunas preguntas sobre el tema, de comas en comparación con el espacio, en la delimitación de parámetros.cmd- coma para separar los parámetros ¿Comparado con el espacio?

Ellos son preguntas que los programadores de C familiarizadas con el cmd, pueden ser capaces de arrojar alguna luz sobre ..

Sé que cuando se hace

c:\>program a b c 

hay 4 parámetros [0]=program[1]=a[2]=b[3]=c

Según hh ntcmds.chm conceptos ..

Shell visión general

; and , are used to separate parameters 

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

veo dir a,b da el mismo resultado que dir a b

pero

c:\>program a,b,c da parámetros [0] = programa [1] = a, b, c

¿Entonces algo? o todo? uso de comandos de windows; y,? y es esa interpretación dentro del código de cada comando, o hecha por el caparazón como con espacio?

Y si está en el código de cada comando ... ¿cómo sabría que lo hago? Noté que la documentación de explorer.exe menciona la coma, p. Ej. usted puede hacer explorer /e,.

pero DIR /? no lo menciona, pero puede usarlo. Y un programa c típico no toma, como un delimitador en absoluto ... Entonces, es el caso que el shell no usa coma para delimitar, usa espacio. Y los comandos de Windows que sí lo hacen, lo hacen porque están (¿todos?) Escritos para delimitar los parámetros que el shell les ha dado más cuando se usan comas.

Respuesta

4

Hay dos diferencias aquí entre Unix y Windows:

  • comandos internos, como DIR están integrados en la carcasa; su sintaxis de línea de comando no tiene que seguir las mismas reglas que para los programas normales
  • En Windows, los programas son responsables de analizar sus propias líneas de comando. La cáscara analiza redirecciones y las tuberías, a continuación, pasa el resto de la línea de comandos para el programa en una cadena de

programas de Windows C incorporada utilizando Visual Studio utilizar el analizador de línea de comandos en el tiempo de ejecución de Microsoft C, la cual es similar a una analizador de shell típico de Unix y obedece espacios y comillas.

Nunca he visto un programa en C que use , o ; como un separador de línea de comando. Conocía el caso especial para explorer /e,., pero nunca había visto el ejemplo dir a,b hasta ahora.

+0

¿Cómo se puede saber qué hace el shell y qué hace MS C runtime o standard lib? Tengo un programa para Windows c con solo #include En la parte superior, y código para mostrar argv. compilado con gcc. No puedo ver una manera de ver qué "parametrización" se realiza desde el shell y cuál es automática desde la biblioteca estándar. También, noto que la coma no funciona para los programas externos xcopy o telnet. Creo que lo he visto para rundll32. Supongo que es solo algo. Tal vez no sea una función en una biblioteca disponible públicamente. Tal vez solo programas de extensión excepcionales que lo hacen apin cmds internos de cmd.exe. – barlop

+0

Todo lo hace el tiempo de ejecución de MS C excepto la funcionalidad de shell. La funcionalidad de Shell incluye cosas como redirección ('<', '>', etc. '>>'), tuberías ('|'), control de flujo ('&&' y '||') y escape ('^'). Como digo, nunca he visto un programa que use ',' en la línea de comandos, así que no me sorprende que copy y telnet no lo admitan. –

+0

¿Está sugiriendo que ms c runtime delimite espacios y comillas? o es eso todavía cáscara? y si es ms c tiempo de ejecución, ¿puedes probarlo? No veo cómo su segundo punto de vista distingue a Unix y Windows porque el shell de Unix tampoco analizaría los redireccionamientos y las tuberías. – barlop

0

Los archivos por lotes utilizan una coma o un punto y coma como un separador alternativo de argumentos.

Prueba archivo por lotes:

@echo %1/%2/%3 

Prueba de funcionamiento:

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

Y, como nota, dir lo utiliza, copy así - esas son las dos shell empotrados y probablemente ejecutar a través un analizador similar como archivos de proceso por lotes también (no es exactamente lo mismo, ya que puede hacer cosas como cd.. o dir/s que no son posibles para nada más). Supongo (nota: especulación) que este es un tipo de compatibilidad hacia atrás que se remonta al DOS o incluso a los días de CP/M. Hoy en día probablemente solo deberías usar espacios. Y como señala Tim, el tiempo de ejecución de C dicta ciertas cosas sobre los argumentos y cómo se supone que deben analizarse. Muchos otros lenguajes/marcos siguen esa convención pero no necesariamente todos. PowerShell, por ejemplo, tiene un manejo de argumentos completamente diferente y esto a veces puede ser una sorpresa cuando se interactúa con programas nativos dentro de él (dicho esto, los cmdlets y funciones de PowerShell no son programas ejecutables en otro lugar, sino archivos por lotes).

+1

escribió "Los cmdlets y las funciones de PowerShell no son programas ejecutables en otro lugar, pero los archivos de proceso por lotes también" deberían ser "no" y "¿borrar?". los archivos por lotes como dices, del mismo modo, no se pueden ejecutar desde powershell, por lo que no veo por qué hay un 'pero' allí. – barlop

Cuestiones relacionadas