Lenguaje de Comandos
Lenguaje de Comandos
Lenguaje de Comandos
ENTORNO DE UN PROGRAMA.
Todos los sistemas operativos, y Windows no es una excepcin, tienen un rea de
datos llamada "entorno". No es nada ms que un rea donde se guardan ciertas
variables con su contenido.
Es importante entender que cada programa de Windows tiene su entorno (igual o
diferente o otro programa). Los entornos se heredan. Cada programa (y el propio
interprete de comandos, cmd.exe, es un programa ms) cuando se lanza, "hereda"
dicho entorno. Por heredar, no quiere decir que "use" el mismo que el programa
padre, sino que al lanzarse, el "loader" -cargador- del sistema operativo lo que
realiza es una copia del entorno padre en una nueva rea de datos y al lanzar el
programa le da como direccin del rea de entorno esa nueva copia del entorno del
"padre".
En otras palabras, cualquier modificacin en las variables de entorno dentro de un
programa no afecta al sistema ni al resto de programas, ya que lo que hara es
modificar su propio entorno: la copia del entorno original del programa padre.
El sistema operativo al cargarse predefine ya una serie de variables de entorno.
Podemos verlas, bien con botn derecho en Mi PC, propiedades, pestaa de opciones
avanzadas y botn de variables de entorno, o bien de una manera mas simple,
lanzando el interprete de comandos (cmd.exe) y tecleando el comando "set" (sin
comillas).
NOTA: Realmente, aunque lo veamos en conjunto, existen dos entornos: uno del
sistema y uno de usuario, pero la visin de ambos es el conjunto de los dos.
Acabamos de ver nuestro primer comando: "set". Este comando nos permite no solo
ver todas las variables, sino tambin definir / cambiar / borrar su contenido y
algunas opciones ms.
Si lo ejecutamos por consola, nos dar al similar a:
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\mi usuario\Datos de programa
CommonProgramFiles=C:\Archivos de programa\Archivos comunes
COMPUTERNAME=MIMAQUINA
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\mi usuario
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;.....etc
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 7 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0703
ProgramFiles=C:\Archivos de programa
...etc....
Fijmonos que la estructura es: nombre de variable=contenido de la variable
Las variables, dentro de una consola de comandos o bien dentro de un script se
referencian para poder ver su contenido encerradas entre smbolos de %. Por
ejemplo, en el caso anterior, para ver el contenido de la variable COMPUTERNAME,
simplemente podemos ejecutar:
echo %COMPUTERNAME%
Esto nos dar como resultado:
MIMAQUINA
Igualmente podramos cambiarlo con el comando set citado anteriormente:
set COMPUTERNAME=nuevoNOMBRE
Pero...
como podemos crear una nueva variable de entorno?: tan simple como darle
un nombre y asignarle su contenido. Por ejemplo:
set nuevo=prueba
Esto crear, si no existe, o modificar el contenido si existiese, de una
variable de entorno llamada "nuevo", y le asignar el contenido de "prueba".
Ya que hemos empezado con el comando "set" vamos a finalizar todo lo que
dicho comando puede hacer. Adems de lo anterior:
set p
nos mostrar en pantalla "todas" las variables de entorno que empiecen por p. Y
para finalizar el modificador /p. Es decir, una sintaxis del estilo:
set /p variable=[literal]
Lo que hace es muestra el "literal" en pantalla y el cursor se queda a continuacin
esperando que metamos un dato. Cuando lo metemos y tecleamos "intro", lo que
hayamos tecleado se asignar a la variable de entorno definida en el set. Por
ejemplo:
set /p dato=Introduce datos:
Nos mostrar por pantalla:
Introduce datos: _
Y cuando introduzcamos los datos los asignar a la variable "dato". Esto es vlido
realizarlo en un script. En ese momento se detendr la ejecucin del script y nos
pedir datos por pantalla. Al pulsar la tecla "intro", se los asignar a dicha variable y
continuar la ejecucin del script.
CARACTERES ESPECIALES
Hay ciertos caracteres "especiales" que hay que usar con extremada precaucin: por
ejemplo, evitar usar, a no ser que lo necesitemos explcitamente, caracteres
reservados como &, >, <, |, %, =, ^.
Pongamos un ejemplo. El carcter & ("and" en ingls, es decir "y" en castellano) se
interpreta como un "y", por tanto, ejecuta lo que hay antes del & "y" adems a
continuacin, ejecuta lo que hay despus del &. Es decir, si ejecutsemos:
set var=a&a
que ha hecho el sistema?. Ha ejecutado el comando que hay antes del &, es
decir:
set var=a
Por tanto le ha asignado a la variable de entorno "var" el contenido "a". A
continuacin, el interprete de comandos intenta ejecutar lo que hay despus del &,
es decir intenta interpretar el comando "a". Como "a" no es un comando reconocido,
ni un .exe, ni un .com, ni el nombre de otro script nos dar el error mostrado
anteriormente. Curiosamente:
set var=a&cmd
Qu hace? Ejecutadlo y ver el resultado.
Pero...y si realmente queremos asignar el contenido del literal "a&a" a la variable
"var", cmo lo hacemos? Simplemente anteponiendo el carcter ^ a cualquiera de
los caracteres especiales. En nuestro caso deberamos haber hecho:
set var=a^&a
si posteriormente ejecutamos un:
echo %var%
Nos seguir mostrando un error, ya que aunque realmente tiene el contenido "a&a",
nos mostrar "a" e intentar ejecutar lo que va a continuacin: intentar la ejecucin
de un comando llamado "a".
Para ver que realmente tiene el contenido solicitado, podemos hacer dos cosas:
set v
Nos mostrar el contenido de todas las variables que empiezan por "v" y podremos
comprobar que la variable "var" contiene lo que realmente desebamos. O bien,
redirigir la salida a un archivo (los smbolos de redireccin y su significado los
veremos mas adelante).
NOTA: Un error bastante corriente cuando se usan caracteres de asignacin y
concatenacin (&) en la misma lnea puede ser:
set var=prueba & set var1=otra_prueba
Cual es, o puede ser, el error cometido? pues...recordemos que todo lo anterior al &
se ejecuta como un comando. Es decir que hemos asignado a la variable "var"?.
Podemos suponer que "prueba". Pero no es as, hemos asignado todo lo anterior al
&, es decir "prueba " -con un espacio en blanco al final. Esto nos puede causar
problemas posteriores si lo que queramos hacer era asignar solo "prueba".
%var:~n,m%
Esto nos extrae de la variable "var", la subcadena desde la posicin "n" con longitud
"m". "n" es el desplazamiento empezando a contar desde 0, por tanto, la primera
posicin es la 0, la segunda la 1, etc.
Pongamos un ejemplo:
set var=123456789
echo %var:~1,4%
%var:str1=str2%
Este comando buscar todas las ocurrencias de la subcadena "str1" dentro de "var"
cambindolas por "str2".
Por ejemplo:
set var=hola como ests
Ejecutad para verlo:
echo %var:como=que tal%
Igualmente podramos asignrselo de nuevo a "var" o bien a otra nueva variable de
entorno. Por ejemplo:
agrupar
operadores unarios
operadores aritmticos
operadores aritmticos
desplazamiento lgico (bit a bit)
bit a bit y
bit a bit exclusivo o
bit a bit
asignacin
- separador de expresin
Por ejemplo:
copy c:\carpeta\archivo.dat d:\backup
El comando (interno) copy, recibe datos, en este caso de la propia lnea de comandos
(en la consola en este caso). Esos datos son dos: "c:\carpeta\archivo.dat" y
Podemos, por ejemplo, verificar cual es el comportamiento del comando "copy". Para
ello vamos a realizar el siguiente ejemplo crendonos una carpeta de trabajo llamada
c:\tmp
c:
cd \
md tmp
echo "texto de un fichero" > c:\tmp\fichero.txt
Con esto, nos hemos posicionado en c: (por si no lo estuvisemos), hemos ido a su
carpeta raz (cd \), y hemos creado una carpeta llamada tmp en donde estuvisemos
posicionados en ese momento (md tmp) -md es abreviatura de "makedir": crear
directorio-. La ltima lnea (echo) nos mostrara por pantalla "texto de un fichero", es
decir nos lo mostrara en el STDOUT. Pero con el smbolo ">" lo que hacemos es
redirigir el STDOUT (la consola en este caso) a un fichero que en nuestro caso es:
c:\tmp\fichero.txt. Si lo abrimos con el cuaderno de notas, veremos que realmente el
texto anterior.
Vamos a copiarlo en otro. Ejecutamos por ejemplo:
copy c:\tmp\fichero.txt c:\tmp\copia.txt
Si a continuacin de este comando ejecutamos:
echo %ERRORLEVEL%
Veremos que el comando anterior nos informa que ha terminado con 0 (se considera
normalmente 0 una finalizacin correcta).
Vamos a provocar que el copy termine con error para ver cual es su comportamiento
en este caso. Un mtodo muy sencillo seria proteger contra escritura el fichero de
salida y luego intentar escribir en l. Es decir:
attrib c:\tmp\copia.txt +r (+r -> colocar como "read only" -solo lectura-)
copy c:\tmp\fichero.txt c:\tmp\copia.txt
Vemos que ahora en pantalla nos informa que "Acceso denegado". Si a continuacin
ejecutamos:
echo %ERRORLEVEL%
Veremos que el cdigo de retorno es 1.
NOTA: en general los mensajes de error deben buscarse en la documentacin del
programa o comando ya que son a voluntad del programador. El sistema operativo lo
nico que hace es situarnos el cdigo de retorno en %ERROLEVEL% y nosotros
OPERADORES DE REDIRECCION
> Escribe la salida del comando (normalmente STDOUT) en un fichero o un
dispositivo (puede por tanto redirigirse a otro dispositivo, no solo a archivo), en lugar
de en la ventana del Smbolo del sistema.
< Lee la entrada (STDIN) del comando desde un archivo, en lugar de leerla desde
la consola.
>> Aade la salida del comando al final de un archivo sin eliminar la informacin
que ya est en l.
>& Escribe la salida de un controlador en la entrada de otro controlador. (lo vemos
posteriormente en detalle.
<& Lee la entrada desde un controlador y la escribe en la salida de otro
controlador.
|
Lee la salida de un comando y la escribe en la entrada de otro comando. Mal
traducido por canalizacin o filtro ("pipe")
Hemos visto que con >& se escribe la salida de un controlador ("handle") en otro.
Vayamos a un ejemplo prctico. En los ejemplos anteriores hemos visto que la salida
de un comando como el copy podemos escribirlo en un fichero con el smbolo >. Pero
tambin hemos comentado que solo redirige en STDOUT, por tanto, si el copy
enviase un mensaje de error (STDERR) esto no se vera en el fichero. Esto es un
problema si lo que queremos es crear un log de ejecucin de un script para poder ver
posteriormente el ejecucin: los mensajes de error precisamente los habramos
perdido.
Pero... recordemos que > escribe el STDOUT. Si fusemos capaces de "redirigir" el
STDERR al STDOUT, entonces el > nos escribira todos los mensajes, de
funcionamiento correcto o errneo en el fichero.
Es decir, si hacemos:
copy c:\tmp\fichero.txt c:\tmp\copia.txt >c:\log.txt
Solo los mensajes de funcionamiento correcto quedaran en c:\log.txt. Pero en
cambio si redirigimos la salida de errores: STDERR ("handle" numero 2) al STDOUT
("handle" numero 1) y luego escribimos, en ese caso todo quedara reflejado en el
archivo log. Por tanto:
Tenemos tres programas del sistema operativo "more" (ms), "find" (buscar) y "sort"
(ordenar) que admiten pipes y que nos pueden servir de ejemplo.
Veamos. Un dir /s nos muestra todos los archivos desde donde estemos posicionados
incluyendo todos los archivos en subcarpetas. Si ejecutamos:
dir c:\ /s
Veremos que empiezan a pasar pantallas de datos que no somos capaces de leer.
Podemos redirigir la salida de este comando al "more". Realmente el "more" no es
nada mas que un programa que admite como entrada toda la salida de otro comando
y que lleva un contador de lneas para irnos mostrando en pantalla 24 lneas y luego
esperar a que pulsemos una tecla.
Ejecutemos por ejemplo:
dir c:\ /s | more
(Cualquiera de los comandos anteriores puede abortarse con CTRL-C).
Un ejemplo de canalizacin y redireccin: imaginemos que queremos en nuestro
disco todos los archivos con extensin .log y dejar la informacin en un fichero de
salida.
dir c:\ /b /s | find /I ".log" > c:\ficheros_log.txt
Los parmetros que he puesto, tanto en el comando dir, como en el comando find,
siempre podemos verlos ejecutando dir /? y find /? para buscar los que mejor se
adapten a lo que queremos.
Otro ejemplo: ver en orden "inverso" los ficheros de un directorio:
dir /b | sort /REVERSE
Los filtros ("pipes") no solo admiten canalizacin. Tambin pueden usarse, como
cualquier programa, con comandos de redireccin para leer entras y escribir salidas
en archivos. Por ejemplo, imaginemos que tenemos un fichero con nombres y
queremos ordenarlo alfabticamente. Simplemente:
sort < lista.txt > listaalf.txt
Esto indicara que la entrada al comando sort viene redirigida desde el fichero
lista.txt y que la salida, en vez de dejarla en pantalla, nos la escriba en listaalf.txt.
En ejemplos que iremos viendo a lo largo de estos captulos quedar mas claro el
concepto.
OPERADORES CONDICIONALES
Son los operadores && y el operador ||
Lo que exista despus del operador && si ejecutar "solo" si la instruccin previa a l
-en la misma lnea- ha terminado correctamente (cdigo 0). Por contra, si usamos ||
solo se ejecutar si la terminacin de la instruccin previa termina incorrectamente
(cdigo distinto de cero)
Por ejemplo:
md kkk && echo "finalizado correcta la creacin"
Solo veremos el mensaje de aviso si la creacin de la carpeta kkk ha sido posible.
Aunque existen ms dispositivos lgicos, llegado este punto solo vamos a ver estos
tres. Veamos unos ejemplos:
1) Imaginemos que hemos recibido una clave de registro de un producto por mail, y
lo queremos guardar en un fichero llamado licencia.txt en una carpeta determinada.
La manera clsica de hacerlo mediante Windows es abrir el cuaderno de notas,
copiar la clave desde el mail recibido y guardar el fichero en la carpeta que queremos
con el nombre licencia.txt. Bien, podramos hacer en una consola de comandos:
copy con licencia.txt
En este punto se quedar el cursor esperando una entrada. Tecleamos la clave
recibida (o la copiamos desde el mail), y para finalizar la entrada de datos le damos
a CTRL-Z (CTRL-Z es la marca estndar de fin de fichero). Es decir, hemos copiado
desde la consola a un fichero de la misma forma que si hubisemos copiado un
fichero a otro fichero.
2) Queremos enviar un fichero a impresora:
copy fichero.txt lpt1
3) No queremos ver, por ejemplo despus de un comando copy la lnea de "xx
archivos copiados" que siempre nos informa el copy. Simplemente redirigimos la
salida al dispositivo nulo.
copy fichero1.txt fichero2.txt >nul
OPERADORES DE COMPARACION
Especifica un operador de comparacin de tres letras. En la siguiente tabla puede ver
los valores de operadorDeComparacin.
EQU igual a (es lo mismo que ==)
NEQ no es igual a
LSS menor que
LEQ menor que o igual a
GTR mayor que
GEQ mayor que o igual a
PARMETROS
Cualquier script es capaz de recibir parmetros desde la lnea invocante. Se
considera parmetro cualquier literal enviado en la lnea que invoca al script. El
sistema considera que los parmetros estn separados por espacios en blanco o bien
por el delimitador ";". Cada parmetro se referencia dentro del script por %1, %2,
%3, etc...
Vamos a crear un script que reciba dos parmetros, el nombre de un fichero y el
nombre de una carpeta. El objetivo del script es copiar el archivo desde la carpeta en
donde estemos posicionados en la carpeta destino siempre y cuando no exista ya en
el destino.
Una manera grosera de realizar el script, llammosle copia.cmd, sin verificar que los
parmetros son correctos, sera:
@echo off
if not exist %2\%1 copy %2 %1
Lo cual es precisamente lo que queramos hacer. He comentado que este script, tal y
como est, est realizado de una manera grosera. Si el nombre del archivo o el
nombre de la carpeta destino tuviese espacios en blanco el sistema considerara que
dicho espacio en blanco es un delimitador de parmetros y por tanto nos llegaran al
script mas parmetros de los deseados. Realmente para realizar correctamente el
script deberamos hacer:
@echo off
if {%1}=={} goto error
if {%2}=={} goto error
if {%3} NEQ {} goto error
if not exist %1 goto error1
if not exist %2\nul goto error2
if exist %2\%1 goto aviso
copy %1 %2\%1 2>&1 >nul
if not errorlevel 1 goto correcto
echo Copia errnea. Verifique permisos de la carpeta destino.
goto:EOF
:error
echo parmetros errneos. Deben recibirse dos parmetros.
goto :EOF
:error1
echo Nombre del fichero origen no existe.
goto :EOF
:error2
echo Carpeta destino no existe.
goto :EOF
:aviso:
echo El archivo ya existe en el destino. No se ha realizado copia.
goto :EOF
:correcto
echo Archivo copiado correctamente.
goto :EOF
Ntese que hemos entrecomillado cada uno de los parmetros. De esta manera solo
se recibirn dos parmetros ya que si no, se recibiran 4 al usar como delimitador el
sistema los espacios en blanco entre ellos.
Comentemos un poco el script.
Bien, el ejemplo anterior nos puede servir para la introduccin de lo que son los
parmetros y como se deben usar o referenciar en el script. Vamos a ver toda la
casustica ms en detalle.
Realmente podemos referenciar los parmetros desde %0 a %9. El parmetro
recibido en %0 no se teclea y siempre el sistema nos pasa como contenido el
nombre del script invocado. Hagamos una prueba:
@echo off
echo Parmetro 0: %0
echo
echo
echo
echo
echo
echo
echo
echo
echo
shift
echo
echo
echo
echo
echo
echo
echo
echo
echo
echo
Parametro
Parametro
Parametro
Parametro
Parametro
Parametro
Parametro
Parametro
Parametro
1:
2:
3:
4:
5:
6:
7:
8:
9:
%1
%2
%3
%4
%5
%6
%7
%8
%9
invocado.cmd
@echo off
echo estoy en el invocado
echo el parmetro del invocado es: %1
Fijmonos que la subrutina la terminamos con goto :EOF. Esto indica que cuando se
la invoca con CALL volver a la lnea de continuacin del invocarte. (Realmente salta
a fin de fichero con lo que provoca la condicin de vuelta que hemos citado
anteriormente.
@echo off
set a=%1
set computername=%a%_mio
....
....
....
Es decir, le estamos diciendo desde la instruccin "setlocal" que todo lo que hagamos
ser local al script. Y cuando se ejecuta "endlocal" (al final del script) le estamos
diciendo que deshaga todas las variables usadas y permanezca tal y como estaba
desde que se ejecut la anterior instruccin "setlocal".
Como norma es conveniente en los scripts (o al menos en el principal si ussemos
llamadas CALL -esto depender de la lgica-) el usar un "setlocal" al inicio del script
y un "endlocal" como ultima instruccin del script.
La instruccin "setlocal" admite adems opcionalmente la siguiente sintaxis:
setlocal {enableextension | disableextensions} {enabledelayedexpansion |
disabledelayedexpansion}
Algunas de ellas -las dos ultimas- ya las hemos comentado: por defecto el interprete
de comandos tiene desactivada la expansin diferida (a menos que se haya
arrancado con /V:ON o bien se hayan modificado ciertas claves de registro para
cambiar el comportamiento general del interprete de comandos), y por ello hay que
prestar especial atencin a la expansin de las variables de entorno en la lnea de
comando antes de que esta pase a ejecucin (recordemos la sintaxis con "!" como
delimitador de la variable de entrono en vez de usar el delimitador "%" normal. Es
conveniente revisar ese capitulo ya que el concepto es extremadamente importante).
comandos internos de Windows como los externos que nos da la propia versin del
sistema operativo. Vamos a car un repaso de todas formas y un pequeo comentario
a cada uno de ellos, excepto para el comando mas potente de Windows: el comando
FOR, el cual merecer todo un capitulo aparte. Es conveniente llegado a este punto
que se vaya consultando cada uno de los comandos que citar a continuacin en
ntcmds.chm.
Los comandos internos son:
ASSOC
CALL
CD o CHDIR
CLS
COLOR
COPY
DEL o ERASE
DIR
ECHO
ENDLOCAL
EXIT
FOR
FTYPE
GOTO
IF
MD o MKDIR
PATH
PAUSE
POPD
PROMPT
PUSHD
REM
REN o RENAME
RM o RMDIR
SET
SETLOCAL
SHIFT
START
TYPE
VER
COMANDO 'FOR'
Es el comando ms importante y ms potente que podemos usar en un script. Por
tanto, vamos a verlo en detalle y haciendo hincapi en ejemplos de su uso.
NOTA: Es el nico comando que tiene sintaxis diferente ejecutado desde la lnea de
comandos y ejecutado desde un script. Los subndices del comando -tal y como se
vern a continuacin- se expresan con un smbolo % desde la lnea de comandos,
pero en un script deben expresarse con un doble smbolo, es decir con %%.
Definicin: Ejecuta un comando especificado para cada archivo de un conjunto de
archivos.
Sintaxis. Admite varias formas: (recordando que en script %variable debe ser %
%variable)
1) for %variable in (grupo) do comando
%variable
Requerido. Representa un parmetro reemplazable. Utilice %variable para ejecutar
for en el smbolo del sistema. Utilice %%variable para ejecutar el comando for
dentro de un archivo por lotes. Las variables distinguen entre maysculas y
minsculas y se deben representar con un valor alfabtico, como %A, %B o %C.
(grupo)
Requerido. Especifica uno o varios archivos, directorios, intervalo de valores o
cadenas de texto que se desea procesar con el comando especificado. Los parntesis
son obligatorios.
El parmetro grupo puede representar un nico grupo de archivos o varios. Puede
utilizar caracteres comodn (es decir, * y ?) para especificar un grupo de archivos.
Los siguientes son grupos de archivos vlidos:
(*.doc)
(*.doc *.txt *.me)
(ene*.doc ene*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
por ejemplo, desde la linea de comandos:
for %f in (c:\windows\*.*) do @echo %f
o bien desde un script:
for %%f in (c:\windows\*.*) do @echo %%f
Nos mostrar los archivos que estn dentro de la carpeta c:\windows (similar a un
"dir" pero solo nos mostrar el nombre.
Ejercicio [for-1]: usando el comando for en la forma citada anteriormente obtener
nicamente el nombre del archivo. Si lo ejecutamos vemos que la salida es
Pero esto no es lo que se solicita, sino que con una sola lnea for, y sin estar
posicionado en la carpeta de Windows se obtenga el mismo resultado que con las
tres instrucciones anteriores.
(la respuesta a estos ejercicios al final del capitulo).
comando
Requerido. Especifica el comando que desea ejecutar en cada archivo, directorio,
intervalo de valores o cadena de texto incluido en el (grupo) especificado.
NOTA: Hay que prestar especial atencin al posible uso del %variable dentro de la
accin 'do' as como al posible uso de variables dentro de l. Recordemos la parte
vista anteriormente de expansin diferida o no del comando a la hora de traducir la
lnea.
NOTA: Cuando estn habilitadas las extensiones de comandos (es el valor por
defecto del cmd.exe en Windows) -ver captulos anteriores- es posible tambin las
sintaxis que veremos a continuacin
2) for /D %variable in (grupo) do comando
/D -> Slo directorios
Si grupo contiene caracteres comodn (* y ?), el comando especificado se ejecuta
para cada directorio (en lugar de un grupo de archivos de un directorio especificado)
que coincida con grupo. La sintaxis es:
for /D %variable in (grupo) do comando [opcionesDeLneaDeComandos]
Por ejemplo, para recorrer todas las subcarpetas de la carpeta Windows:
for /d %s in (c:\windows\*.*) do @echo %s
3) for /R [unidad :]rutaDeAcceso] %variable in (grupo) do comando
[opcionesDeLneaDeComandos]
/R -> Recursividad. Recorre el rbol de directorios con raz en [unidad:]rutaDeAcceso
y ejecuta la instruccin for en cada directorio del rbol. Si no se especifica un
directorio despus de /R, se considera el directorio actual. Si grupo tiene nicamente
un punto (.) slo se enumerar el rbol de directorios.
[for-1]
for %f in (c:\windows\*.*) do @echo %~nxf
(Revisar el capitulo de "parmetros" para ver los prefijos ~n o bien ~x que pueden
ponerse a parmetros (o bien a variables explicitas o implcitas en un for -son
equivalentes a parmetros- para entender el comando anterior)
[for-2]
Vamos a realizarlo en un script.
@echo off
setlocal enabledelayedexpansion
set ruta=
del c:\datos.txt 2>&1 >nul
for /r c:\windows %%a in (.) do (
set ruta=%%a&@for %%f in ("!ruta:\.=!\*.*") do echo %%~nxf;!ruta:\.=! >>c:\datos.txt
)
endlocal
[for-3]
Vamos a realizarlo en un script.
@echo off
setlocal enabledelayedexpansion
if "%*" EQU "" goto error0
pushd
cd "%*" >nul
if errorlevel 1 goto error1
set ruta=
del c:\datos.txt 2>&1 >nul
for /r "%*" %%a in (.) do (
set ruta=%%a&set r=!ruta:\.=!&@for %%f in ("!r!\*.*") do echo %%~nxf;!r! >>c:\datos.txt
)
goto FIN
:error0
echo Falta parametro.
goto FIN
:error1
echo Carpeta recibida por parametro inexistente
goto FIN
:FIN
endlocal
popd
Razonar el script y cada detalle del uso del parmetro as como los controles
realizados.
[for-4]
for %i in (1,1,30) ping 172.16.0.%i
skip=n
delims=xxx
tokens=x,y,m-n
usebackq
Reemplazo de variables
Se han mejorado los modificadores de reemplazo de las referencias a variables de
for. La tabla siguiente muestra la sintaxis opcional (para cualquier variable I):
Variable con modificador Descripcin
%~I
Expande %I que elimina las comillas ("") delimitadoras.
%~fI
Expande %I a un nombre de ruta de acceso completo.
%~dI
Expande %I a una letra de unidad solamente.
%~pI
Expande %I a una ruta de acceso solamente.
%~nI
Expande %I a un nombre de archivo solamente.
%~xI
Expande %I a una extensin de archivo solamente.
%~sI
Expande la ruta de acceso para que solamente contenga nombres
cortos.
%~aI
Expande %I a los atributos del archivo.
%~tI
Expande %I a la fecha y hora del archivo.
%~zI
Expande %I al tamao del archivo.
El comando anterior leer todos los ficheros enumerados en la clusula 'in' del
directorio en curso y el contenido de ellos, lnea por lnea lo pasar dentro de la
variable i al do de ejecucin.
Recordemos que en un script el %i debe sustituirse por %%i. Ntese igualmente que
esta sintaxis del for no admite caracteres "comodn" en los nombres de archivo, es
decir, no podemos referenciarlos por *.abc o bien por ???.abc, sino que el nombre
debe estar totalmente cualificado.
Como podramos entonces hacer para ver el contenido de todos los archivos con
extensin abc?. Bien, usando un poco la imaginacin y sabiendo que el for normal
(sin /f) es capaz de enumerar los archivos en un directorio, podremos endentar dos
for para hacerlo.
for %i in (*.abc *.txt) do @for /f %j in (%i) do @echo %j
PID
Session Name
Session#
Mem Usage
=== ================ ======== ============
0
Console
0
24 K
4
Console
0
252 K
412
Console
0
644 K
524
Console
0
5.848 K
564
Console
0
5.512 K
608
Console
0
6.208 K
..........
Fijmonos ahora por delante de la clusula "in" que es lo que hay:
"skip=2 tokens=1,2,* delims= " %%g
Esto sacara un "dir" y esperara hasta que pulsemos una tecla. En vez de ejecutarlo
directamente vamos a ejecutarlo desde dentro de un for
for /f "tokens=*" %i in ('pr.cmd') do @echo %i
cualquier cosa en la nica consola que tenemos abierta, esta entrada se pasar al
segundo cmd (es decir, redirige tambin el STDIN). En ese momento, en la segunda
consola (oculta) al recibir la tecla, contina y finaliza. En el momento de la
finalizacin es cuando devuelve los datos, lnea por lnea al for.