Quisiera saber como crear mis propios comandos que lean instrucciones trabajando con LEX

Quisiera saber como puedo crear mis propios comandos que lean instrucciones en

Msdos, estoy trabajando con lex; ejemplo tecleo en pantalla pwd, y me muestra el directorio activo análogo en windows.

1 Respuesta

Respuesta
1

No conozco LEX y no sé si podré ayudarte, pero si quieres que lo intentemos puedes intentar aclararme algo como se supone que puede LEX "transmitir" órdenes a MSDOS, porque "pwd" es un comando de LINUX/UNIX ¿no?

hace unos días empece a trabajar con MSDOS y no tengo mayor conocimiento, bueno en si,el trabajo que nos dejaron para realizar es que tenemos que realizar un interprete de comandos similar a la de shell de LINUX pero que corra sobre windows. Es decir que deberá implementar un scanner que lea instrucciones linea por linea de un archivo de texto o desde el teclado y ejecute una por una las instrucciones, la salida sera un archivo o a pantalla con el resultado de las operaciones. y que debemos utilizar LEX. ....... Lex funciona como los archivos .Batch

En principio, la ventana de comandos de MSDOS puede considerarse similar a la shell de Linux, aunque sus comandos sean menos potentes en general. Los archivos batch de MSDOS (archivos BAT se llaman en este entorno) serían similares a los archivos de comandos de Linux.

Otra cosa sería intentar reproducir sobre Windows los comandos típicos de las shell's de Linux (por ejemplo que al teclear en una ventana de MSDO "ls -l" sacara un listado de los archivos similar al de Linux. Eso se podría ir haciendo a base de archivos BAT.

Ponme un ejemplo de lo que crees que se podría teclear, en que entorno se teclearía y que se espera que salga. Dices que Lex funciona como los archivos .Batch pero no acabo de entenderlo. Si tecleas "ver" o "dir" en Lex, ¿qué ocurre? ¿Puedes capturar un ejemplo?

eso es a lo que yo me refería el ejemplo que puso es exactamente lo que debe hacer

pero no se como empezar. Y perdón por no saber explicarme.

podría darme un ejemplo, de como se programa esa instrucción del ejemplo que se refirió.

Habría que hacer varias cosas:

1) Establecer una carpeta o directorio (digamos c:\bat) en la que guardaríamos los pseudocomandos linux en forma de archivos BAT. Por ejemplo para el comando linux "ls" crearíamos un archivo ls.bat en esa carpeta (y lo mismo para los distintos comandos)

2) Modificar la variable de entorno PATH para que incluya el directorio "c:\bat" entre los que revisa antes de ejecutar un posible comando. Esto se haría con el comando

PATH c:\bat;%PATH%

Que añade al contenido actual de la variable (recuperado con la invocación %PATH%) el directorio indicado

3) Establecer una especie de equivalencia burda entre comandos Linux <-> MSDOS para saber como "traducirlos". Para esto puede ayudarte lo que aparece en la página

http://www.linux-cd.com.ar/manuales/rh9.0/rhl-gsg-es-9/ch-doslinux.html

Además deberías complementar esta información con la específica de Linux (creo que mediante el comando "man" en Linux) y la específica de MSDOS (normalmente añadiendo "/?" al comando del que se solicita información).

Empezando con un ejemplo más sencillo que el del comando "ls" podríamos hacerlo con el comando "pwd". Según puede verse en la página mencionada el comando "equivalente" de MSDOS sería el "chdir". No conozco a fondo Linux y no estoy en condiciones de ver si la equivalencia es completa o no pero si tecleas chdir en una ventana de comandos de MSDOS te saldrá (por ejemplo):

C:\WINDOWS\system32>chdir
C:\WINDOWS\system32

Vamos a ver como crearíamos el archivo pwd.bat. Puedes abrir el "Bloc de notas" de Windows (Inicio/Programas/Accesorios/Bloc de notas) y escribir en él:

@echo off
Chdir

Luego guardas el archivo con "Guardar como..." en la carpeta c:\bat.

Si has modificado el PATH según lo indicado en el punto 2 cuando en la ventana de comandos de MSDOS teclees pwd te saldrá (por ejemplo):

C:\WINDOWS\system32>pwd
C:\WINDOWS\system32

Una vez que consigas esto, si te parece nos metemos con el "ls" que nos llevará a tratar los parámetros de la llamada a los archivos de comandos BAT en MSDOS (la presencia o no del "-l" y de otras posibles opciones del comando "ls" en Linux) pero yo solo pretendo orientarte inicialmente porque habría que trabajar bastante para hacer un buen tratamiento de estos comandos.

hola:

conseguí realizar "pwd" y funciono, podrias hacer otro ejemplo mas complejo para poder entender bien y poder realizar diferentes comandos. Como por ejemplo puedes darme un ejemplo de cualquiera de estos comandos, de como crear el archivo "is" "cp" "man" o "date". Que estos creo que son mas complejos.

otra pregunta. Se utiliza la misma lógica para realizar los demás archivos o tengo que saber mas de códigos que se utiliza en ".bat" para poder hacer mas funciones como por ejemplo "rm" borrar archivo o "mkdir" que crea un directorio.. y de ante mano gracias por tus respuestas me están sirviendo de mucho.

Como te decía el intentar "programar" otros comandos exigiría previamente comprender un poco a fondo el funcionamiento en ambos entornos.

Un estudio, comparativo aunque no exhaustivo, de los comandos "dir" de MSDOS y "ls" de Linux podría indicar las siguientes "equivalencias" (seguramente habría más, pero eso ya te lo dejo a ti):

Linux MSDOS
------- ----------
ls dir /B
ls -a dir /B
ls -R dir /ES
ls -l dir /ON /QUE
ls -t dir /OD
ls -S dir /OS

A partir de ese estudio el archivo ls.bat podría ser (lo separo entre líneas de =========):

=====================================================

@ECHO off
SET A=%1
SET B=%A:~0,1%
IF "%B%" == "-" GOTO opciones
IF "%2" == "" (
dir /B %1
GOTO :EOF
) ELSE (
ECHO Formato de llamada erroneo
GOTO :ayuda
)
:opciones
IF "%1" == "-a" (
dir /B %2
GOTO :EOF
)
IF "%1" == "-R" (
dir /S %2
GOTO :EOF
)
IF "%1" == "-l" (
dir /ON /Q %2
GOTO :EOF
)
IF "%1" == "-t" (
dir /OD %2
GOTO :EOF
)
IF "%1" == "-S" (
dir /OS %2
GOTO :EOF
)
:Ayuda
ECHO El formato de la llamada es:
ECHO %0 [-opciones] [carpeta]

=============================================================

La llamada se haría (por ejemplo): ls -l c:\windows\msagent y este es el resultado (en mi caso):

C:\WINDOWS\system32>ls -l c:\windows\msagent
El volumen de la unidad C es Sistema
El número de serie del volumen es: 00C0-12B1
Directorio de c:\windows\msagent
14/11/2010 10:17 <DIR> BUILTIN\Administradores.
14/11/2010 10:17 <DIR> BUILTIN\Administradores..
14/04/2008 08:48 24.064 BUILTIN\Administradoresagentanm.dll
14/04/2008 08:48 214.016 BUILTIN\Administradoresagentctl.dll
14/04/2008 08:48 42.496 BUILTIN\Administradoresagentdp2.dll
14/04/2008 08:48 57.344 BUILTIN\Administradoresagentdpv.dll
14/04/2008 08:48 49.152 BUILTIN\Administradoresagentmpx.dll
14/04/2008 08:48 24.064 BUILTIN\Administradoresagentpsh.dll
14/04/2008 08:48 44.032 BUILTIN\Administradoresagentsr.dll
14/04/2008 08:48 256.512 BUILTIN\Administradoresagentsvr.exe
14/04/2008 00:02 18.432 BUILTIN\Administradoresagtctl15.tlb
14/04/2008 08:48 24.064 BUILTIN\Administradoresagtintl.dll
26/01/2006 10:32 <DIR> BUILTIN\Administradoreschars
14/11/2010 10:17 <DIR> BUILTIN\Administradoresintl
14/04/2008 08:48 39.936 BUILTIN\Administradoresmslwvtts.dll
11 archivos 794.112 bytes
4 dirs 1.777.348.608 bytes libres

Como ves este ejemplo es considerablemente más complejo y utiliza muchas más opciones de la programación "batch" del MSDOS. Deberías estudiarla un poco, pero si quieres que te explique algo (después de intentar entenderlo por tu cuenta) solo tienes que preguntarlo.

Creo que tu segunda pregunta queda contestada con la complejidad de este segundo caso.

Me alegro de que te esté sirviendo de algo.

El corrector ortográfico/completador de la página me hizo un par de jugadas. Voy a ver si consigo evitarlo ahora. La tabla de comparación sería en realidad:

Linux MSDOS
------- ----------
ls dir /B
ls -a dir /B
ls -R dir /S
ls -l dir /ON /Q
ls -t dir /OD
ls -S dir /OS

Espero que no me haya metido más "gazapos".

Más saludos,

GGG

hola de nuevo:

estoy avanzando pero a paso lento

podrías ayudarme.

cual es la dirección del directorio personal del usuario????

ejemplo que al teclear "pwd" muestra el directorio activo

pero quisiera que al teclear "cd" me muestre el directorio personal de usuario.

.

En MSDOS (en realidad, más bien en Windows) el concepto de usuario no es tan rígido como en Linux y no es obligatorio que cualquier usuario tenga un perfil en el que se defina su directorio por defecto. No obstante la evolución de Windows ha ido en el sentido de acercarse a Linux/UNIX en bastantes cosas y actualmente existe una variable de entorno que puede recoger esa información: USERPROFILE.

Por tanto, para conseguir lo que quieres tendrías que crear un cd.bat con el contenido siguiente:

@echo off
Echo %USERPROFILE%

Pero aquí tenemos un grave problema. Y es que "cd" como tal, es un comando nativo de MSDOS (en realidad se trata del comando "chdir") y no se me ocurre ninguna manera de hacer que la ejecución de cd.bat se priorice sobre el propio comando "cd" de MSDOS.

Esto es lo que me sale, después de crear el cd.bat tal como indico y guardarlo en el directorio c:\bat y modificar el PATH para que vaya en primer lugar a c:\bat

C:\WINDOWS\system32>cd
C:\WINDOWS\system32
C:\WINDOWS\system32>c:\bat\cd
C:\Documents and Settings\t097423

Como ves el primer "cd" ejecuta el comando interno de MSDOS y muestra el directorio actual. El segundo "cd" forzado a ser el BAT si que muestra el directorio de usuario.

Voy a investigar el asunto y te avisaré si encuentro algo.

hola.

al intentar lo anterior me muestra un texto en "cmd" que mi usuario no se reconoce como un comando interno y externo,

Podrías ayudarme con la sintaxis de como puedo utilizar el archivo "cp.bat" que realiza una copia de un archivo file1 file2.

y podrías ayudarme con el exit

para poder salir de la ventana de cmd. gracias

¿El mensaje es:

"xxxx" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable

¿

?

Si es así se trata de que no existe el xxxx.bat o que no has modificado el PATH para que incluya la carpeta donde lo has guardado.

Si no es exactamente así cópiame el texto exacto del mensaje y la acción que lo ha provocado. Si hay algún BAT involucrado cópiamelo "exactamente".

En cuanto al cp.bat sería algo así.

=================================

@echo off

if "%2" == "" goto :ayuda

copy %1 %2

goto :eof

:Ayuda

Echo El formato del comando es:

echo %0 archivo_origen archivo_destino

=================================

No entiendo que problema puedes tener con el "exit" para salir de la ventana de "cmd". Si escribes "exit" en la ventana de "cmd" te la cierra, si lo incluyes en un bat que ejecutas desde la ventana de "cmd" también te la cierra por lo que, en muchos casos, no interesa poner el "exit" en el BAT. Cuéntame, concretamente, que problema tienes.

hola de nuevo

estoy avanzando en este proyecto y

quisiera que me ayudaras en estos dos últimos comandos

que son "mkdir" "rmdir" gracias.....

Con estos dos comandos estamos en la misma situación que con el "cd". Ambos existen en MSDOS y con una función muy similar a la de Linux. Si, a pesar de todo, se quisieran fabricar los correspondientes BAT (sabiendo, como en el caso que te comenté del "cd" que para ejecutar el BAT en lugar del comando interno de MSDOS habría que invocarlo explícitamente), habría que establecer la correspondencia entre opciones, de forma similar a la que utilicé para comparar "dir" con "ls".

Por ejemplo, para el mkdir compara la información obtenida en Linux mediante "man mkdir" con la obtenida en MSDO mediante "mkdir /?". A partir de ahí, aplicando el esquema usado en el caso del ls.bat, sería sencillo obtenerlos. Pero considero que el trabajo de establecer la correspondencia entre opciones deberías hacerlo tú. Si, una vez hecho ese trabajo, hay algo que no funciona como esperas puedes planteármelo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas