Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Batch File Es PDF
Batch File Es PDF
#batch-file
Tabla de contenido
Acerca de 1
Observaciones 2
Examples 2
Obteniendo ayuda 4
Examples 5
Números al azar 5
Pseudoaleatorio 6
Alfabetos al azar 6
Distribución pseudoaleatoria 6
Distribución uniforme 7
Introducción 8
Examples 8
Se acabó el tiempo 8
Se acabó el tiempo 8
Pausa 9
Silbido 9
Silbido 9
Dormir 10
Dormir 10
Examples 11
Examples 14
Examples 16
Sintaxis 17
Observaciones 17
Examples 17
Introducción 20
Sintaxis 20
Examples 20
Bloquear comentarios 21
Sintaxis 23
Observaciones 23
Examples 23
Redireccion 23
Introducción 27
Observaciones 27
Examples 27
Sintaxis 32
Parámetros 32
Observaciones 32
Examples 32
Introducción 34
Sintaxis 34
Parámetros 34
Observaciones 34
Examples 34
Mostrando mensajes 34
Ajuste de eco 35
Obtención y configuración 35
Introducción 39
Observaciones 39
Examples 39
Confusión de paréntesis 39
Porque 39
Solución 39
Porque 40
Soluciones 40
Extra 40
Porque 41
Solución 41
Introducción 42
Examples 42
Problema de seguridad 43
ENCONTRAR 43
FINDSTR 43
PARA / F 44
Capítulo 15: Evitar las limitaciones aritméticas en los archivos por lotes. 46
Introducción 46
Examples 46
Usando PowerShell 46
Usando jscript 46
Observaciones 48
Examples 48
Función simple 49
Combinándolos a todos 49
Introducción 52
Examples 52
Introducción 54
Examples 54
Incruste código vbscript en un archivo por lotes sin usar archivos temporales 55
Introducción 56
Examples 56
Macro basica 56
Comentarios 56
$ Usos de caracteres 56
Comando separador 56
Examples 58
DEPURAR 58
ADJUNTAR 59
BITSADMIN 59
Introducción 60
Examples 60
Mover archivos 60
Borrando archivos 61
Introducción 64
Examples 64
Citas 64
Ejemplos y soluciones 64
Ejemplo A 64
Solución A 64
Ejemplo B 64
Solución B 65
Código de espagueti 65
Ejemplos y soluciones 65
Ejemplo A 65
Solución A 65
Ejemplo B 66
Sintaxis 67
Observaciones 67
Examples 67
Iteración 69
Examples 70
Sintaxis 74
Parámetros 74
Observaciones 74
Examples 74
Un ejemplo... 74
Escribir en un archivo 75
Sintaxis 77
Observaciones 77
Sintaxis de 1 línea 77
Sintaxis multilínea 77
Examples 78
Comparando cuerdas 78
Comparando Errorlevel 78
Introducción 80
Sintaxis 80
Parámetros 80
Observaciones 80
Examples 80
Programas de ejemplo 80
Examples 82
Declaración 82
Espacios en variables 82
Uso 83
Sustitución Variable 83
Creditos 90
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: batch-file
It is an unofficial and free batch-file ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official batch-file.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com
https://riptutorial.com/es/home 1
Capítulo 1: Comenzando con el archivo por
lotes
Observaciones
Desde Microsoft Technet:
Con los archivos por lotes, que también se denominan programas por lotes o scripts,
puede simplificar las tareas rutinarias o repetitivas. Un archivo por lotes es un archivo
de texto sin formato que contiene uno o más comandos y tiene una extensión de
nombre de archivo .bat o .cmd. Cuando escribe el nombre del archivo en el símbolo
del sistema, Cmd.exe ejecuta los comandos de forma secuencial a medida que
aparecen en el archivo.
Extensión Observaciones
.murciélago Esta extensión se ejecuta con MS-DOS y todas las versiones de Windows.
Evite los nombres que ya son el nombre de los comandos incorporados. como tracert Hay una
utilidad llamada tracert.exe . Por lo tanto, evite nombrar un archivo por lotes tracert.bat
La forma más fácil de ejecutar un archivo por lotes es simplemente haciendo doble clic en su
icono. O pegue la ruta completa del archivo en un símbolo del sistema, o simplemente su nombre,
si el símbolo del sistema se inició desde el directorio de archivos por lotes, luego ingrese.
Ejemplo:
C:\Foo\Bar>test.bat
C:\Foo\Bar>C:\Foo\Bar\Baz\test.bat
Examples
Abrir un símbolo del sistema
El símbolo del sistema viene preinstalado en todos los sistemas operativos Windows NT,
https://riptutorial.com/es/home 2
Windows CE, OS / 2 y eComStation, y existe como cmd.exe , normalmente ubicado en
C:\Windows\system32\cmd.exe
En Windows 7, las formas más rápidas de abrir el símbolo del sistema son:
• Si tiene una ventana de explorador abierta, escriba "cmd" en la barra de direcciones para
abrir una solicitud en el directorio seleccionado actualmente.
• Haga clic con el botón derecho en una carpeta en el Explorador mientras mantiene
presionada la tecla Mayús y seleccione "Abrir ventana de comandos aquí".
En algunos casos, es posible que necesite ejecutar cmd con permisos elevados, en este caso,
haga clic derecho y seleccione "Ejecutar como administrador". Esto también se puede lograr
presionando Control + Shift + Enter en lugar de Enter cuando se utiliza el modo 1 de los puntos
anteriores.
Cualquier editor ASCII puede editar archivos por lotes. Aquí puede encontrar una lista de editores
que pueden sintaxis resaltar la sintaxis por lotes. También puede usar el bloc de notas
predeterminado que se incluye con Windows para editar y ver un archivo por lotes, aunque no
ofrece resaltado de sintaxis.
Alternativamente, la forma más "primitiva" de crear un archivo por lotes es redirigir la salida desde
la línea de comandos a un archivo, por ejemplo.
Puede editar un archivo por lotes haciendo clic derecho en el archivo y seleccionando "Editar" en
el menú contextual.
Para ver el contenido de un archivo por lotes desde un símbolo del sistema, ejecute el siguiente
comando:
type first.bat
También puede comenzar a editar su archivo por lotes con el bloc de notas desde el símbolo del
sistema escribiendo
https://riptutorial.com/es/home 3
notepad first.bat
Obteniendo ayuda
Para obtener ayuda sobre un comando de archivo por lotes, puede utilizar la ayuda incorporada.
Abra un símbolo del sistema (cuyo archivo ejecutable es cmd.exe ) e ingrese help para ver todos
los comandos disponibles.
Para obtener ayuda para cualquiera de estos comandos, escriba help seguida del nombre del
comando.
Por ejemplo:
help help
Mostrará:
HELP [command]
Tratar:
help /?
Nota:
https://riptutorial.com/es/home 4
Capítulo 2: Aleatorio en archivos por lotes
Examples
Números al azar
Usando la variable dinámica %Random% , podemos obtener un entero aleatorio de 0 a 32767. Por
ejemplo:
echo %random%
Obviamente, esto devuelve un número entero de 0 a 32767. Pero a veces queremos que esté en
un rango específico, digamos de 1 a 100.
set /a result=(%RANDOM%*max/32768)+min
donde max es el número superior que se puede generar, y min es el número más pequeño que se
puede generar. Tenga en cuenta que no obtendrá ningún número decimal porque set /a
redondea automáticamente. Para generar un número aleatorio decimal, intente esto:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
set /a whole=(%RANDOM%*65536/32768)+1
Para generar números más grandes que 32767, aquí hay un método mejor.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
El código anterior extrae el carácter 1 de cada %random% . Pero esto se hace a propósito.
Dado que el número random podría ser un número de un dígito, la extracción de los últimos 2
https://riptutorial.com/es/home 5
dígitos no funcionará. Por eso solo extraemos el último carácter. En este caso, tenemos un 6
%random:~-1% , que genera el máximo de 999999 y el mínimo de 000000 ; es posible que deba ajustar
esto para que se ajuste a sus necesidades.
Pseudoaleatorio
cmd.exe genera la semilla en función del momento en que se inició la sección de cmd , por lo que si
inicia la sección de mutliple casi al mismo tiempo, es posible que el resultado no sea lo
suficientemente aleatorio.
Alfabetos al azar
Desafortunadamente, los lotes no tienen un método incorporado para generar alfabetos, pero al
usar %random% y for ciclo, podemos 'generar' alfabetos.
set /a result=(%random%*26/32768)+1
for /f "tokens=%result%" %%I in ("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do (
echo %%I
)
Uno puede poner un total de 31 artículos en 1 for bucle, y prácticamente artículos ilimitados
usando [este método]. ( Lote - para orden de parámetros de bucle
Distribución pseudoaleatoria
De acuerdo con esta respuesta de desbordamiento de pila , el usuario CherryDT señaló este
código:
La variable dinámica interna %random% hace da una distribución uniforme, pero el código de
seguridad no será un azar uniformado. Este código genera un número aleatorio entre 0 ~ 99, pero
el resultado no será uniforme. 0 ~ 67 ocurrirán más de 68 ~ 99 desde 32767 MOD 100 = 67 .
Para generar una distribución aleatoria uniforme usando el código anterior, entonces se debe
cambiar 100 . Aquí hay un método para obtener un número que crea una distribución uniforme.
https://riptutorial.com/es/home 6
32767 mod (32767 / n)
donde n es un número entero, entre 0 ~ 32767, el resultado puede ser decimal y puede no
funcionar por lotes.
Distribución uniforme
set /a result=(%RANDOM%*100/32768)+1
Este método generará una distribución uniforme. Evita el uso de % , que es más como "resto" y
luego "módulo" en un script por lotes. Sin usar % , el resultado será uniforme.
set /a test=%random%
)
)
https://riptutorial.com/es/home 7
Capítulo 3: Añadir retraso al archivo por lotes
Introducción
Este tema le enseñará una de las muchas cosas útiles que debe saber en el lenguaje de scripting,
archivo por lotes; Agregar un retraso / pausa / tiempo de espera a su archivo por lotes.
Examples
Se acabó el tiempo
Se acabó el tiempo
La forma más sencilla de hacer una demora o pausa durante un cierto tiempo, es con el comando
estándar TIMEOUT . Para hacer un tiempo de espera que dura exactamente un minuto escribimos:
timeout /t 60
En primer lugar, usamos el comando TIMEOUT con el parámetro /T (que simplemente significa
tiempo de espera) y luego especificamos la cantidad de segundos a esperar. En este caso ... 60
segundos.
timeout /t 60 /nobreak
Para ocultar el mensaje, use el argumento NUL (Para la explicación de NUL : haga clic aquí )
https://riptutorial.com/es/home 8
timeout /t 60 > nul
or
timeout /t 60 /nobreak > nul
Pausa
PAUSE
Esto mostrará el texto Press any key to continue . . . A continuación, agregue una nueva línea
en la entrada del usuario.
Digamos que queremos crear un programa "Hello World" y después de hacer clic en algo en
nuestro teclado, queremos que salga del programa con el comando EXIT .
Aquí usa el comando ECHO para decir "Hola Mundo". Luego usamos el comando PAUSE que muestra
Press any key to continue . . . y luego usamos el comando EXIT para terminar la secuencia de
comandos BATCH actual.
Para ocultar el mensaje, redirigimos la salida a un dispositivo especial llamado nul . Esto no es
realmente un dispositivo real, pero todo lo que le enviemos se desecha.
Silbido
Silbido
Uno de los comandos más utilizados para demorar durante cierto tiempo es hacer ping .
Uso básico
https://riptutorial.com/es/home 9
REM 1.1.1.1 is an non-existing IP so the -w flag can ping a delay and go to next command
Simplemente agregue >nul en la parte posterior del comando para redirigirlo a nulo.
Dormir
Dormir
En sistemas Windows más antiguos, el timeout no está disponible. Sin embargo, podemos usar el
comando sleep .
Uso
sleep 1
Muy autoexplicativo; dormir durante 1 segundo. Sin embargo, sleep modo de espera es un
comando deperactado y debe reemplazarse por el tiempo de espera .
Disponibilidad
Este comando está disponible en el antiguo sistema de Windows. También SLEEP.exe se incluye
en 2003 Resource Kit.
https://riptutorial.com/es/home 10
Capítulo 4: Archivo de lote argumentos de
línea de comando
Examples
Argumentos de línea de comando suministrados a archivos por lotes
Los argumentos de línea de comando del archivo de lote son valores de parámetros enviados al
iniciar el lote. Deben incluirse entre comillas si contienen espacios. En un archivo por lotes en
ejecución, los argumentos se utilizan para varios propósitos, es decir, la redirección a :labels ,
variables de configuración o comandos en ejecución.
Los argumentos se mencionan en el archivo por lotes usando %1, %2, ..., %9 .
@echo off
setlocal EnableDelayedExpansion
if not "%1"=="" (
set "dir=%~1" & set "file=%~2"
type !dir!\!file! | find /n /i "True" >nul^
&& echo Success! || echo Failure
)
exit /b
Notas:
Cuando se suministran más de 9 argumentos, se puede usar el comando shift [/n] , donde /n
significa comenzar en el enésimo argumento, n está entre cero y ocho.
:args
set /a "i+=1"
set arg!i!=%~1
call echo arg!i! = %%arg!i!%%
shift
goto :args
Tenga en cuenta que, en el ejemplo anterior, la variable de expansión retardada i se utiliza para
https://riptutorial.com/es/home 11
asignar valores de argumento a la matriz de variables. El comando de call permite mostrar dichos
valores variables dentro del bucle.
Contando argumentos:
set i=5
call set "path%i%=%%~i"
@echo off
(
shift
shift
echo %1
)
Como esto podría ser un problema al desplazar entre paréntesis para acceder al argumento,
deberá usar la llamada:
@echo off
(
shift
shift
call echo %%1
)
Ahora la salida será 3 . A medida que se usa el comando CALL (que dará lugar a una expansión de
variable adicional) con esta técnica, los argumentos de acceso también se pueden parametrizar:
@echo off
set argument=1
shift
shift
call echo %%%argument%
https://riptutorial.com/es/home 12
con expansión retrasada:
@echo off
setlocal enableDelayedExpansion
set argument=1
shift
shift
call echo %%!argument!
la salida será
https://riptutorial.com/es/home 13
Capítulo 5: Archivos por lotes e híbridos
Powershell
Examples
Ejecutar Powershell con archivos temporales
Esto ha sido mencionado en otros temas híbridos una y otra vez. El método de la vieja escuela,
pero fácil de ejecutar Powershell es por:
@echo off
echo powershell-command>Temp.ps1
echo another line>>Temp.ps1
rem echo the script into a temporary file
del Temp.ps1
rem Optionally remove the temporary script
El método anterior requiere toneladas de declaraciones de echo si se requiere un script largo, aquí
hay un mejor método sugerido por @Aacini
@echo off
setlocal
rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > Temp.ps1
goto :EOF
<resource>
PS
Powershell script
https://riptutorial.com/es/home 14
línea
También es posible que desee incluir otras banderas, como -Nologo para mejorar el resultado real.
Este es el enfoque propuesto por el usuario rojo de stackoverflow que también puede manejar los
argumentos de la línea de comando:
goto :EOF
: end batch / begin powershell #>
"Result:"
$argv | %{ "`$argv[{0}]: $_" -f $i++ }
llamado así:
Producirá:
Result:
$argv[0]: C:\Users\rojo\Desktop\test.bat
$argv[1]: arg1
$argv[2]: This is arg2
$argv[3]: arg3
https://riptutorial.com/es/home 15
Capítulo 6: Buscar cadenas en lote
Examples
Búsqueda de cadenas básicas
El comando FIND puede escanear archivos grandes línea por línea para encontrar una cadena
determinada. No admite comodines en la cadena de búsqueda.
TYPE scan2.txt | FIND "Failed" /c && echo Scan failed || echo Scan Succeeded
Consulte las fuentes de ayuda de FIND y FINDSTR para obtener más información.
La siguiente secuencia de comandos muestra una técnica de archivos divididos más avanzada,
donde la función FOR recorre una lista de archivos en un directorio, y cada contenido de archivo
se canaliza a FINDSTR que busca una cadena que contiene la subcadena var precedida por un
número indefinido de espacios y reemplazada por cualquier extra texto. Una vez encontrado, el
archivo buscado se reemplaza por uno nuevo que contiene solo la parte de texto sobre la cadena
de búsqueda.
@echo off
setlocal enabledelayedexpansion
pushd "%temp%\Test"
for %%G in ("*.txt") do (set "break="
(for /f "tokens=*" %%H in (%%~G) do (
if not defined break (
echo %%H | findstr /r /b /c:"[ ]*var.*" >nul && set break=TRUE || echo %%H )
)) >> %%~nG_mod.txt
del %%~G & ren %%~nG_mod.txt %%G )
popd
exit /b
Tenga en cuenta que la configuración de break=TRUE permite salir del ciclo FOR del archivo
buscado, una vez que se encuentra la primera aparición de la cadena de búsqueda.
https://riptutorial.com/es/home 16
Capítulo 7: Cambiando directorios y listando
sus contenidos
Sintaxis
• echo% cd% - muestra la ruta actual del directorio
• echo %__CD__% : muestra la ruta actual del directorio con una barra diagonal inversa (sin
documentar)
Observaciones
¿Por qué es importante y cuáles son sus usos y ventajas?
Examples
Para visualizar el directorio actual
Formato y uso:
echo %cd%
%cd% es una variable del sistema que contiene la ruta del directorio actual
Formato:
https://riptutorial.com/es/home 17
cd "<path>"
Ejemplo:
cdes una abreviatura de chdir y los dos comandos se comportan exactamente de la misma
manera. En aras de la coherencia, cd se utilizará en todo este tema.
Para navegar al directorio un nivel por encima del directorio actual, especifique el directorio del
sistema ..
cd ..
Para navegar a un directorio que está dentro del directorio actual, simplemente cd al nombre de la
carpeta sin escribir la ruta completa (incluya el nombre del directorio entre comillas si contiene
espacios).
Por ejemplo, para ingresar C:\Program Files (x86)\Microsoft Office mientras se encuentra en el
directorio C:\Program Files (x86) , se puede usar la siguiente sintaxis:
cd "Microsoft Office"
cd por sí solo no permitirá que un usuario se mueva entre unidades. Para moverse a una unidad
diferente, se debe especificar la opción /d .
cd /d "D:\Office Work"
Uso para enumerar todas las carpetas y archivos en el directorio actual: dir
Al especificar una ruta con espacios, debe estar entre comillas: dir "C:\Path With Spaces"
https://riptutorial.com/es/home 18
Pushd "D:\Foo"
Dir
Popd
Pushd cambiará el directorio al directorio siguiente (en este caso D: \ Foo. Popd regresa al directorio
original.
Formato:
cd/
cd/ está configurado para cambiar el directorio actual a la raíz de la unidad actual
https://riptutorial.com/es/home 19
Capítulo 8: Comentarios en archivos por
lotes
Introducción
Los comentarios se utilizan para mostrar información en un script por lotes.
Sintaxis
• movimiento rápido del ojo
• ::
• & ::
• Ir a: Etiqueta
:Etiqueta
Examples
Uso de REM para comentarios
Precaución : cuando las etiquetas se usan como comentarios dentro de un bloque de código
entre corchetes o for comando, el procesador de comando espera que cada etiqueta sea seguida
por al menos un comando, por lo que cuando se realiza un salto a la etiqueta tendrá algo que
ejecutar.
El shell cmd intentará ejecutar la segunda línea incluso si está formateada como una etiqueta (y
https://riptutorial.com/es/home 20
esto provoca un error ):
(
echo This example will fail
:: some comment
)
Cuando se trabaja dentro de bloques de código entre corchetes, es definitivamente más seguro
usar REM para todas las líneas de comentarios.
También es posible utilizar variables como comentarios. Esto puede ser útil para evitar
condicionalmente que se ejecuten comandos:
@echo off
setlocal
if /i "%~1"=="update" (set _skip=) Else (set _skip=REM)
%_skip% copy update.dat
%_skip% echo Update applied
...
Cuando se utiliza el fragmento de código anterior en un archivo por lotes, las líneas que
comienzan con %_skip% solo se ejecutan si se llama al archivo por lotes con la update como
parámetro.
Bloquear comentarios
El formato de archivo por lotes no tiene una sintaxis de comentarios de bloque, pero hay una
solución fácil para esto.
Normalmente, cada línea de un archivo por lotes es leída y luego ejecutada por el analizador,
pero se puede usar una instrucción goto para saltar un bloque de texto sin formato (que se puede
usar como un comentario de bloque):
@echo off
goto :start
:start
Dado que el analizador nunca ve las líneas entre la goto :start y :start , puede contener texto
arbitrario (incluidos los caracteres de control sin la necesidad de escapar) y el analizador no
generará un error.
Para comentar en la misma línea que el código, puede usar &:: o &rem . También puedes usar && o
https://riptutorial.com/es/home 21
|| para reemplazar & .
Ejemplo:
@echo off
echo This is a test &::This is a comment
echo This is another test &rem This is another comment
pause
Una curiosidad : el comando SET permite comentarios en línea limitados sin &rem :
Limitaciones:
<!-- : Comment
Esto funciona tanto con script por lotes como WSF. La etiqueta de cierre ( --> ), solo funciona en
WSF.
<!--: Comment --> Falso: la etiqueta de cierre solo funciona para el FSM
--> Falso
https://riptutorial.com/es/home 22
Capítulo 9: Creando archivos usando Batch
Introducción
Una característica útil de los archivos por lotes es poder crear archivos con ellos. Esta sección
muestra cómo crear archivos usando código de lote.
Sintaxis
• echo (escribe aquí lo que quieras en el ser) >> (nombre de archivo)
• eco (nombre de variable) >> (nombre de archivo)
Observaciones
Si existe un archivo, > sobrescribirá el archivo y >> agregará al final del archivo. Si un archivo no
existe, ambos crearán un nuevo archivo.
Además, el comando echo agrega automáticamente una nueva línea después de su cadena.
Asi que
1
2
No esta:
1 1 2
1 2
Además, no puede modificar una sola línea en un archivo de texto. Debe leer todo el archivo,
modificarlo en su código y luego escribir nuevamente en todo el archivo.
Examples
Redireccion
https://riptutorial.com/es/home 23
Formato:
Ejemplos:
2. echo your name is %name% >> myfile.txt agrega "su nombre es xxxx" en myfile.txt
(This will NOT make a file in the folder "Program Files", and might show an error message)
Pero entonces, ¿cómo lo hacemos? Bueno, en realidad es extremadamente simple ... Al escribir
una ruta o nombre de archivo que tiene un espacio incluido en su nombre, recuerde usar
"comillas"
Pero, ¿qué sucede si desea crear un archivo que genere un archivo nuevo?
https://riptutorial.com/es/home 24
(example.bat is going to contain "message > file1.bat")
El siguiente paso requiere que usted tenga algún conocimiento sobre las variables y las
declaraciones:
Haga clic aquí para conocer las variables | Haga clic aquí para obtener más información
sobre las declaraciones if y else.
Variables:
SET example="text"
ECHO %example% > file.bat
(This will output "text" to file.bat)
Declaraciones IF / ELSE:
para dar salida a toda la línea, entonces hacemos lo mismo que antes.
(
echo echo hi, this is the date today
echo date /T
echo echo created on %DATE%
echo pause >nul
)>hi.bat
https://riptutorial.com/es/home 25
El intérprete de comandos trata toda la sección entre paréntesis como un solo comando, luego
guarda toda la salida en hi.bat .
https://riptutorial.com/es/home 26
Capítulo 10: Diferencias entre Batch
(Windows) y Terminal (Linux)
Introducción
Batch y Bash son bastante diferentes. Los indicadores de lote se indican con una / , mientras que
los indicadores de bash usan un - . La capitalización es importante en bash, pero (casi) no en
lote. Los nombres de variables por lotes pueden contener espacios, los nombres de variables
bash no pueden. En última instancia, ambas son formas de manipular e interactuar con la línea de
comandos. No es sorprendente que exista una superposición de tamaño razonable entre las
capacidades de los dos sistemas.
Observaciones
• bitsadmin está en desuso en favor de los BITS del cmdlet de PowerShell pero aún funciona
a partir de Windows 10 versión 1607
• certutil separa los pares de dígitos hexadecimales con un espacio, por lo que md5sum
devolverá un valor de ejemplo de d41d8cd98f00b204e9800998ecf8427e , mientras que certutil
muestra el mismo valor que d4 1d 8c d9 8f 00 b2 04 e9 80 09 98 ec f8 42 7e
• Para cd en otro disco (por ejemplo, de C: a D :) se debe usar el indicador /d
• del no puede borrar carpetas, use rm lugar
• grep es mucho más poderoso que find y findstr , es casi no es justo para compararlos; find
no tiene capacidades de findstr regulares y findstr tiene capacidades de findstr
extremadamente limitadas ( [az]{2} no es una sintaxis válida, pero [az][az] es)
• for bucles en el símbolo del sistema de Windows solo se pueden usar nombres de variables
de un solo carácter; Esta es la única vez que los nombres de las variables por lotes
distinguen entre mayúsculas y minúsculas
• for bucles en el símbolo del sistema también use la variable forma %A lugar de %A% ; for
bucles en lotes, use la variable forma %%A
• md crea automáticamente los directorios principales necesarios, mientras que mkdir necesita
la -p para hacerlo
• rem no puede usarse como un carácter de comentario en línea a menos que esté precedido
por un &
• :: no se puede usar como un comentario en línea en absoluto, y tampoco se debe usar
dentro de un bloque de código (conjunto de paréntesis)
• Tenga en cuenta que algunos comandos de Windows como ping todavía se usan - como
indicadores
Examples
Comandos de lotes y sus equivalentes de Bash
https://riptutorial.com/es/home 27
Lote Golpetazo Descripción
Obtiene la suma de
certutil -hashfile
file_name MD5
md5sum file_name comprobación MD5 de
file_name
for /F %A in (fileset*) do for item in fileset*; do; Hacer algo por cada archivo en
something something; done un conjunto de archivos.
https://riptutorial.com/es/home 28
Lote Golpetazo Descripción
do something comando.
if [ "variable"="value" ];
if "%variable%"=="value" (
then Compara dos valores
Elimina directorios
rd /s rm -rf independientemente de si
estaban vacíos o no
https://riptutorial.com/es/home 29
Lote Golpetazo Descripción
en valor.
Realiza operaciones
matemáticas (el lote solo puede
set /a variable=equation variable=$((equation))
usar números enteros de 32
bits)
Ordena la salida
sort sort
alfabéticamente por línea
Muestra el contenido de un
type cat
archivo.
https://riptutorial.com/es/home 30
Lote Golpetazo Descripción
$1 , $2 , $3 ,
%1 , %2 , %3 , etc. Los parámetros dados a un guión.
etc.
https://riptutorial.com/es/home 31
Capítulo 11: Directorio de pila
Sintaxis
• PUSHD [camino]
• POPD
Parámetros
Parámetro Detalles
Observaciones
• El uso de pushd sin parámetros imprimirá la pila.
• El comando popd sobrescribirá el valor actual del directorio actual.
Examples
Eliminar archivos de texto
El siguiente ejemplo muestra cómo puede usar el comando pushd y el comando popd en
un programa por lotes para cambiar el directorio actual desde el que se ejecutó el
programa por lotes y luego volver a cambiarlo:
@echo off
rem This batch file deletes all .txt files in a specified directory
pushd %1
del *.txt
popd
cls
echo All text files deleted in the %1 directory
Obtenido de https://technet.microsoft.com/en-us/library/cc771180%28v=ws.11%29.aspx
Para imprimir la pila de directorios, use el comando pushd sin ningún parámetro:
@echo off
cd C:\example\
pushd one
pushd ..\two
https://riptutorial.com/es/home 32
pushd ..\..
pushd
echo Current Directory: %cd%
echo:
popd
pushd three
pushd
echo Current Directory: %cd%
Salida:
C:\example\two
C:\example\one
C:\example
Current Directory: C:\
C:\example\two
C:\example\one
C:\example
Current Directory: C:\example\two\three
https://riptutorial.com/es/home 33
Capítulo 12: Eco
Introducción
echo puede ser usado para controlar y producir salida.
Sintaxis
• ECHO [ON | APAGADO]
• Mensaje de ECHO
• ECHO (mensaje
• ECO(
Parámetros
Parámetro Detalles
Observaciones
• También mostrará una cadena vacía. Sin embargo, esto es más lento que el echo( ya
echo.
que echo. Buscará un archivo llamado "echo". Solo si este archivo no existe, el comando
funcionará, pero esta verificación lo hará más lento.
• echo: se comportará como echo( , a menos que el message vea como una ruta de archivo, por
ejemplo echo:foo\..\test.bat . En este caso, el intérprete verá echo:foo como nombre de
carpeta, tira echo:foo\..\ (porque aparece solo para ingresar al directorio echo:foo luego
dejarlo nuevamente) luego ejecute test.bat , que no es el comportamiento deseado.
Examples
Mostrando mensajes
Esto dará salida a la cadena de Some Text seguido de una nueva línea.
Para mostrar las cadenas On y Off (mayúsculas y minúsculas) o la cadena vacía, utilice a ( lugar
de espacios en blanco:
https://riptutorial.com/es/home 34
echo(ON
echo(
echo(off
ON
off
También es común usar echo. para mostrar una línea en blanco, pero vea las observaciones de
por qué esta no es la mejor idea.
Este comando intentará establecer la variable llamada cadena vacía en la entrada del usuario
siguiendo una solicitud. El archivo nul se redirige al comando con <nul , por lo que el comando se
rendirá tan pronto como intente leerlo y solo quedará la cadena de solicitud. Debido a que el
usuario nunca escribió una nueva línea, no hay salto de línea.
Ajuste de eco
C:\Windows\System32>where explorer
C:\Windows\System32\explorer.exe
C:\Windows\System32>exit
Hello, World!
C:\Windows\System32\explorer.exe
Obtención y configuración
Para obtener (mostrar) la configuración de eco, use echo sin parámetros:
> echo
ECHO is on.
https://riptutorial.com/es/home 35
> echo off
> echo
ECHO is off.
> echo on
> echo
ECHO is on.
Tenga en cuenta que con estos ejemplos, la solicitud ha sido representada por > . Cuando se
cambia la configuración de eco, el aviso aparecerá y desaparecerá, pero eso hace que los
ejemplos no estén claros.
Tenga en cuenta que es posible evitar que un comando se repita incluso cuando el eco está
activado, colocando un carácter @ antes del comando.
"Some Text"
echo Hello World REM this is not a comment because it is being echoed!
Sin embargo, el echo seguirá generando variables (consulte Uso de variables ) y los caracteres
especiales seguirán teniendo efecto:
hello
world
https://riptutorial.com/es/home 36
Salida a ruta
(This will NOT make a file on the Desktop, and might show an error message)
Pero entonces, ¿cómo lo hacemos? Bueno, en realidad es extremadamente simple ... Al escribir
una ruta o nombre de archivo que tiene un espacio incluido en su nombre, recuerde usar
"comillas"
Pero, ¿qué sucede si desea crear un archivo que genere un archivo nuevo?
Si no ha aprendido qué son las variables y las declaraciones, lo más probable es que no
comprenda lo siguiente: haga clic aquí para obtener información sobre las variables | Haga
clic aquí para conocer las declaraciones "if"
Variables:
set example="text"
echo %example% > file.bat
(This will output "text" to file.bat)
otras declaraciones:
else = ||
if ^%example^%=="Hello" echo True || echo False > file.bat
https://riptutorial.com/es/home 37
(This will output:
if %example%=="Hello" echo True
@Echo off
@echo off evita que se muestren la solicitud y el contenido del archivo por lotes, de modo que solo
se vea la salida. La @ hace que la salida del comando echo off oculte.
En el siguiente ejemplo, el echo on tendrá efecto después de que se llegue al final del contexto de
paréntesis:
@echo off
(
echo on
echo ##
)
echo $$
Para "activar" el eco en un contexto de corchetes (incluidos los comandos FOR y IF ) puede usar la
macro FOR / f :
@echo off
setlocal
:: echo on macro should followed by the command you want to execute with echo turned on
set "echo_on=echo on&for %%. in (.) do"
(
%echo_on% echo ###
)
https://riptutorial.com/es/home 38
Capítulo 13: Errores en el procesador
cmd.exe
Introducción
Este tema se centrará en los errores causados por los errores del procesador. Estas son las
cosas en las que nos centraríamos en la causa y la solución del problema.
Observaciones
En el ejemplo de la Extensión de archivo DEL , el usuario X. Liu advierte que este error no se
producirá cuando la extensión del archivo en el comando DEL sea inferior a 3 caracteres.
Examples
Confusión de paréntesis
Porque
Considere el siguiente fragmento de código.
if 1==1 (
set /a result = 2*(3+4)
)
https://riptutorial.com/es/home 39
Solución
De acuerdo con un set /? de CMD.exe alemán set /? , tendríamos que citar operaciones
aritméticas. Aquí hay un ejemplo.
Anterior Resultado
Por cierto, de acuerdo con un set /? CMD.exe en inglés set /? , se requieren comillas si los
operadores lógicos o de módulo están presentes en la expresión (aunque esto no es un paso
obligatorio ).
Porque
anyInvaildCommand ^
Nota: ¡Asegúrate de que el caret ( ^ ) sea el último carácter! ¡Cualquier CR\LF adicional no
funcionará en absoluto!
El caret busca al siguiente personaje para escapar. Sin embargo, ya no hay más personajes
disponibles para escapar, por lo que cmd recorre infinitamente, buscando un personaje para
escapar. En este proceso de "bucle", cmd.exe consumirá la memoria de su computadora. Y poco a
poco devorando toda la memoria, llevando la computadora a las rodillas.
Este problema puede llevar a preocupaciones de seguridad más graves, ya que uno podría
ingresar el código en la computadora desbloqueada.
Soluciones
• Usar la página de códigos UTF-16 podría resolver este problema. Solo UTF-8 o ASCII
causaría el error.
• Asegúrese de que haya un CR\LF adicional en el archivo, o simplemente no use caret al final
del archivo.
Extra
https://riptutorial.com/es/home 40
Este error parece estar resuelto en Windows 10.
Este error fue informado por steve2916 desde este hilo del Foro de Microsoft Windows.
Porque
Considere una carpeta con tales archivos.
TestA.doc
TestB.doc
TestC.docx
TestD.docx
Si queremos eliminar todos los archivos .doc en este directorio, generalmente haríamos:
del *.doc
Sin embargo, este comando también elimina los archivos .docx . Lo mismo sucede en las
extensiones de archivo con este patrón.
Presentar un Archivo b
Como podemos ver, siempre que la cadena de extensión de archivo contenga la cadena utilizada
en el comando del , se eliminará el archivo. Tenga en cuenta que este error solo se produce
cuando la cadena de extensión utilizada en el comando del tiene al menos tres caracteres. Por
ejemplo, del *.do no elimina A.doc o A.docx .
Solución
En el hilo, el usuario MicroCompsUnltd notó que el uso de Powershell resolvería el problema.
https://riptutorial.com/es/home 41
Capítulo 14: Escapar de personajes
especiales
Introducción
En todos los cmd.exe y DOS versiones de DOS , algunos caracteres están reservados para un uso
específico (por ejemplo, redirección de comandos). Este tema tratará sobre cómo utilizar los
caracteres especiales sin problemas.
Examples
Escapar con caret (^)
echo > Hi
echo ^> Hi
Este primer comando no generaría > Hi porque > es un carácter especial, lo que significa redirigir
la salida a un archivo. En este caso, el archivo se llama "Hola".
Sin embargo, en el segundo comando, > Hi se emitirá sin ningún problema porque caret ( ^ ) le
dice al > que deje de funcionar como el comando "redirigir la salida al archivo", ahora > es solo un
carácter normal.
Aquí hay una lista de caracteres especiales que se pueden escapar (tomar y editar desde la
página de Rob van der Woude)
Resultado
Personaje Observaciones
Escapado
^ ^^
Y ^&
< ^<
> ^>
| ^|
\ ^\
https://riptutorial.com/es/home 42
Resultado
Personaje Observaciones
Escapado
activado
Entrada Salida
^& Y
^^^& ^&
^^^^^& ^^ &
Problema de seguridad
Un poco fuera de tema aquí, pero esto es muy importante! ¡Un escape de careta no deseado al
final del archivo podría causar una pérdida de memoria!
any-invalid-command-you-like-here ^
¡Este comando perdería toda la memoria, haciendo que el sistema sea completamente
inutilizable ! Vea aquí para más información.
En find y findstr , hay algunos caracteres especiales que requieren cierta precaución.
ENCONTRAR
Solo hay un personaje que necesita escapar: " cita. Para escapar, simplemente agregue otra cita
junto a ella. Así que " convierte en "" . Bastante simple.
FINDSTR
https://riptutorial.com/es/home 43
Findstrviene con un montón de personajes para escapar, así que ten mucho cuidado. Usando \ ,
podemos escapar de caracteres especiales. Aquí hay una lista de personajes especiales para
escapar
\ \\
El \[
] \]
" \"
. \.
* \*
? \?
PARA / F
En una declaración FOR /F , algunos personajes deben escapar, aquí una lista (tomada y editada
de la página de Rob van der Woude)
Resultado
Personaje Observaciones
Escapado
, ^, ┒
; ^; ┃
( ^( ┃
) ^) ┙
https://riptutorial.com/es/home 44
Caracteres extra especiales
Aquí hay una lista de otros caracteres especiales, que requieren (s) / pueden necesitar escapar,
pero no se mencionan anteriormente.
Resultado
Personaje Observaciones
Escapado
% %%
Cuando hay una expresión con una tubería, el cmd comienza con dos hilos en ambos lados de la
tubería y la expresión se analiza dos veces (para cada lado de la tubería), por lo que es necesario
doblar el caret.
En el lado izquierdo:
echo ^^^&|more
En el lado derecho:
break|echo ^^^&
https://riptutorial.com/es/home 45
Capítulo 15: Evitar las limitaciones
aritméticas en los archivos por lotes.
Introducción
Los archivos por lotes solo permiten cálculos de enteros de 32 bits, aunque esto se puede omitir
con diferentes enfoques.
Examples
Usando PowerShell
@echo off
set "expression=(2+3)*10/1000"
for /f %%# in ('"powershell %expression%"') do set result=%%#
echo %result%
Tenga en cuenta las comillas dobles adicionales en for /f que evitan que los corchetes entren en
conflicto con la sintaxis de comando for.
El problema potencial es que powershell es mucho más lento que usar wsh / vbscript / jscript
debido a la carga de .net framerwork
Usando jscript
WSH/JScriptse instala en todos los sistemas de Windows desde NT, por lo que su uso para
cálculos más complejos lo hace bastante portátil. JScript es más fácil de combinar con un archivo
por lotes:
set "expression=2*(2+3)/1000"
for /f %%# in ('cscript //nologo //e:jscript "%~f0" "%expression%"') do set
result=%%#
echo %result%
:: more batch code
exit /b %errorlevel%
@end
WScript.Echo(eval(WScript.Arguments(0)));
Con este enfoque, puede poner todo su código en un solo archivo. Es más rápido que usar
powershell. Aquí y aquí se pueden encontrar scripts más avanzados (que se pueden usar como
https://riptutorial.com/es/home 46
archivos externos).
1. Aquí se puede encontrar la biblioteca matemática más completa que emula los cálculos con
lápiz y papel y permite trabajar con números más grandes.
2. Aquí hay otros ejemplos de emulaciones de lápiz y papel: AGREGAR , Comparación ,
Multiplicar
3. Algunas implementaciones de funciones matemáticas se pueden encontrar aquí .
Lea Evitar las limitaciones aritméticas en los archivos por lotes. en línea:
https://riptutorial.com/es/batch-file/topic/10702/evitar-las-limitaciones-aritmeticas-en-los-archivos-
por-lotes-
https://riptutorial.com/es/home 47
Capítulo 16: Funciones
Observaciones
Puede agregar variables de inicio a la función agregando <parameter> a su etiqueta. Se puede
acceder a estas variables iniciales con %n donde n es el número de la variable inicial ( %1 para el
primero, %2 para el segundo. Este método %n funciona para% 1 -% 9. Para el parámetro 10 - 255,
necesitará para utilizar el comando Shift ).
Por ejemplo:
Una vez que use call :function param1 param2 , se puede acceder a param1 con %1 , y param2 con %2
.
Nota: el <parameter> no es estrictamente necesario, pero ayuda con la legibilidad.
Un buen truco que es útil cuando hay muchas variables volando es usar setlocal y endlocal junto
con %n . setlocal y endlocal esencialmente hacen que la función sea su propia instancia separada
del símbolo del sistema, las variables establecidas solo endlocal en el marco.
Si está usando setlocal y endlocal , y está devolviendo valores globales, use esto.
Esto establece el valor global var a variable . Puede encadenar estos juntos para múltiples
variables.
Esto establece la variable global var a variable y el valor global var2 a variable number 2 .
Dado que el código en bloques de códigos también se realiza simultáneamente, también puede
hacerlo.
if "%var%"=="" (
endlocal
set %~2=10
)
if "%var%"=="" (
set %~2=10
endlocal
)
Examples
https://riptutorial.com/es/home 48
Función simple
call :FunctionX
rem More code...
:FunctionX
rem Some code here.
goto :eof
Esta es una función muy simple. Las funciones son comandos en el programa que realizan varios
comandos a la vez. Las funciones se crean creando una etiqueta y colocando un código en ella, y
una vez que se hace, se agrega goto :eof o exit /b <ErrorlevelYou'dLike> que vuelve al lugar
donde se invocó. Las funciones se invocan con call :functionname adparams .
Esto toma los parámetros adicionales de la call como si la función fuera un archivo por lotes
separado.
Nota: el <parameter> no es necesario, pero ayuda con la legibilidad.
set var1=123456789
set var2=abcdef
call :specialvars
echo %var1%, %var2%
rem More code...
:specialvars
setlocal
set var1=987654321
set var2=fedcba
endlocal
goto :eof
Cuando se encuentran dentro de la sección setlocal , endlocal section, las variables se separan
de las variables de la persona que llama, por lo tanto, por qué% var1% y% var2% no se
cambiaron.
Combinándolos a todos
set importantvar=importantstuff
https://riptutorial.com/es/home 49
call :stuff 123 var1
rem More code...
Esto utiliza la función básica, setlocal y endlocal y argumentos para crear una pequeña función
extraña.
La técnica de funciones anónimas utiliza el hecho de que el comando CALL usa GOTO internamente
cuando se llama a la subrutina y se abusa de la impresión de mensajes de ayuda con la
expansión doble variable :
@echo off
setlocal
set "anonymous=/?"
if "%0" == ":%anonymous%" (
echo(
echo Anonymous call:
echo %%1=%1 %%2=%2 %%3=%3
exit /b 0
)>&3
Puede llamar a una función anónima solo si se define después del contexto de CALL (o después de
terminar los paréntesis si la CALL se ejecuta entre paréntesis). No se puede llamar desde un script
externo , pero es una llamada de función más lenta de lo normal.
@echo off
:function1
echo argument1 - %1
goto :eof
Para ejecutar solo : function1 sin el código del resto del archivo, debe poner una etiqueta :
function1 en el llamador y usarlo así:
https://riptutorial.com/es/home 50
@echo off
:function1
library.bat %*
argumento1 - ###
https://riptutorial.com/es/home 51
Capítulo 17: Híbridos por lotes y JSCript
Introducción
JScript es en realidad el superconjunto de Javascript (es la versión 1.8.1, por lo que algunas de
las funciones más recientes no están disponibles), y se pueden incrustar en un script por batch
para ampliar las funciones de batch scripts por batch . Por lo general, las técnicas de incrustación
utilizan las directivas de JScript (que no forman parte del estándar oficial de Javascript) para
separar el lote y el código de JScript. JScript le permite trabajar con objetos Com / ActiveX, así
como con objetos WMI además del Javascript estándar.
Examples
JScript incrustado en un archivo por lotes
Este siguiente ejemplo es creado por el usuario Michael Dillon a partir de esta respuesta .
@set @junk=1 /*
@echo off
cscript //nologo //E:jscript %0 %*
goto :eof
*/
• Ejecute el comando cscript que se llama a sí mismo con todos los argumentos
proporcionados.
• Nota: Necesitamos la parte @set @junk=1 porque el archivo por lotes no reconoce /*
como un comando, pero una declaración de set será una solución alternativa. JScript
reconocerá /* como un comentario, por lo que el otro archivo por batch no será
ejecutado por el motor de JScript.
Puede agregar su JScript después de */ y comenzar a extender sus scripts de archivos por lotes.
https://riptutorial.com/es/home 52
Como se mencionó aquí , el método de la vieja escuela para ejecutar otro script es mediante el
uso de archivos temporales. Simplemente haga echo en un archivo y luego ejecútelo (y elimínelo
opcionalmente).
@echo off
echo //A JS Comment > TempJS.js
echo //Add your code>>TempJS.js
del /f /s /q TempJS.js
Pero esto requeriría muchas declaraciones de echo para crear un JScript relativamente grande.
Aquí hay un método mejor por Aacini.
@echo off
setlocal
rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > TempJS.js
goto :EOF
<resource>
JScript
JScript
JScript
https://riptutorial.com/es/home 53
Capítulo 18: Híbridos por lotes y VBS
Introducción
Batch son capaces de ejecutarse con la funcionalidad VBS , lo que aumenta aún más su
confiabilidad. Por ejemplo, VBS puede lidiar con decimales, espacios y algunas otras operaciones
avanzadas que no se pueden realizar por batch . También es capaz de trabajar con objetos WMI y
ActiveX.
Examples
Ejecutar VBS con archivo (s) temporal (s)
El método de la vieja escuela para ejecutar otra secuencia de comandos de un batch es hacer
echo la secuencia de comandos en otra ubicación, y luego ejecutarlo.
@echo off
rem VBS below
echo your vbs > TempVBS.vbs
echo other vbs>>TempVBS.vbs
rem End of VBS
El método anterior requeriría mucho echo (vbs) >> TempVBS.vbs , así que aquí hay una manera de
acortarlo. (código de Aacini)
@echo off
setlocal
rem Skip such number of lines and show the rest of this file
(for /F "usebackq skip=%start% delims=" %%a in ("%~F0") do echo %%a) > Program.vbs
<resource>
your vbs
another line of vbs
El último método es mediante el uso de streams . Un archivo puede tener algunas secuencias. Y
cada flujo puede contener información diferente.
https://riptutorial.com/es/home 54
@echo off
Incruste código vbscript en un archivo por lotes sin usar archivos temporales
Aquí hay un ejemplo con la técnica (hack) inventada por el usuario Liviu de los foros de dostips :
@echo off
echo Printed by CMD.EXE
cscript //nologo "%~f0?.wsf" //job:JS //job:VBS
exit /b %errorlevel%
WScript.Echo("Printed by VBScript"):
</script>
</job>
<job id="VBS">
<script language="JScript">
WScript.Echo("Printed by JScript");
</script>
</job>
</package>
Dado que la ejecución del archivo wsf con el host del script de Windows es sensible a la
extensión, puede ejecutar un archivo con cualquier extensión agregando ?.wsf al final del archivo
(que es el núcleo del hack). Si bien el ejemplo de Liviu es probablemente más robusto, el código
anterior es una versión más simplificada. Como a wsh no le importan las cosas que están fuera
del nodo <package> no está obligado a poner todo en comentarios xml. Aunque hay que tener
cuidado con los símbolos de redirección ( < y > )
https://riptutorial.com/es/home 55
Capítulo 19: Macros de archivos por lotes
Introducción
En un símbolo del sistema, puede usar DOSKEY para crear macros. En un archivo por lotes
puede definir una variable que se puede llamar como un fragmento de código e incluso pasarle
argumentos.
Examples
Macro basica
Usando DOSKEY , podemos crear macros para simplificar la escritura de muchos comandos en el
símbolo del sistema. Echa un vistazo al siguiente ejemplo.
Comentarios
;= Comment
;= Comment
;= Remember to end your comment with ;=
;=
$ Usos de caracteres
Comando separador
$T es el equivalente de & en un script por lotes. Uno puede unir comandos juntos como tal.
https://riptutorial.com/es/home 56
$1 refiere al primer argumento de línea de comando
macros DOSKEY no funcionan en un script por lotes. Sin embargo, podemos usar una
DOSKEY
pequeña solución.
Este script puede simular la función macro. También se pueden usar los símbolos ( & ) para unir
comandos, como $T en DOSKEY .
Si desea una "macro" relativamente grande, puede probar una función simple o echar un vistazo
a otros temas de funciones aquí .
https://riptutorial.com/es/home 57
Capítulo 20: Mandatos por lotes obsoletos y
sus reemplazos
Examples
DEPURAR
DEBUG comando DEBUG se usó para crear archivos binarios / ejecutables desde un archivo por lotes.
El comando aún está disponible en versiones de Windows de 32 bits, pero es capaz de crear
archivos binarios solo con instrucciones de 16 bits, lo que lo hace inutilizable para máquinas de
64 bits. Ahora CERTUTIL se usa para ese propósito, que permite decodificar / codificar archivos
binarios / multimedia de formatos HEX o BASE64. Ejemplifique con un archivo que crea un
archivo de icono:
@echo off
-----BEGIN CERTIFICATE-----
/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAMgAA/+4ADkFkb2Jl
AGTAAAAAAf/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDg0NDgwR
DxITFBMSDxgYGhoYGCMiIiIjJycnJycnJycnJwEJCAgJCgkLCQkLDgsNCw4RDg4O
DhETDQ0ODQ0TGBEPDw8PERgWFxQUFBcWGhoYGBoaISEgISEnJycnJycnJycn/8AA
EQgACgAKAwEiAAIRAQMRAf/EAFsAAQEBAAAAAAAAAAAAAAAAAAAGBwEBAQAAAAAA
AAAAAAAAAAAAAAEQAAIBAwQDAAAAAAAAAAAAAAEDAgARBSExIwQSIhMRAQEBAAAA
AAAAAAAAAAAAAAARIf/aAAwDAQACEQMRAD8A13PZ5eIX3gO8ktKZfFPksvQ8r4uL
ecJmx1BMSbm8D6UVKVcg/9k=
-----END CERTIFICATE-----
@echo off
https://riptutorial.com/es/home 58
(echo 0100 04 03 00 00 00 00 00 00 00 00 00 00 01 03 02 00) >>pointer.hex
(echo 0110 11 05 21 31 23 04 12 22 13 11 01 01 01 00 00 00) >>pointer.hex
(echo 0120 00 00 00 00 00 00 00 00 00 00 00 11 21 ff da 00) >>pointer.hex
(echo 0130 0c 03 01 00 02 11 03 11 00 3f 00 d7 73 d9 e5 e2) >>pointer.hex
(echo 0140 17 de 03 bc 92 d2 99 7c 53 e4 b2 f4 3c af 8b 8b) >>pointer.hex
(echo 0150 79 c2 66 c7 50 4c 49 b9 bc 0f a5 15 29 57 20 ff) >>pointer.hex
(echo 0160 d9 ) >>pointer.hex
Como puede ver, el hex requiere un archivo temporal adicional y las expansiones de formato
hexadecimal son más grandes
ADJUNTAR
APPEND fue un comando en msdos que permitía usar archivos de recursos / medios como si
estuvieran en el mismo directorio. El comando todavía está disponible en las versiones de 32 bits
de Windows, pero parece que no está funcionando. En algunas fuentes (incluyendo microsofts) se
señala que el comando es reemplazado por DPATH, pero no es del todo cierto. A pesar de que el
mensaje de ayuda de DPATH apunta al comando APPEND, su sintaxis es igual a PATH . Los
directorios enumerados en DPATH se pueden usar con la redirección de entrada o el comando de
tipo :
@echo off
dpath %windir%
set /p var=<win.ini
echo using dpath with input redirection:
echo %var%
echo.
echo using dpath with type command:
type win.ini
BITSADMIN
BITSADMIN se utilizó para transferir documentos, descargar sitios web, descargar archivos de sitios
web, etc. Este comando es un comando obsoleto y puede eliminarse en las próximas
actualizaciones de Windows. Para evitar este problema, use el nuevo BIT cmdlet Powershell BIT
cmdlet .
@echo off
Bitsadmin /create /download Stackoverflow.com
rem download the website StackOverflow.com
https://riptutorial.com/es/home 59
Capítulo 21: Manejo de archivos en archivos
por lotes
Introducción
En este tema, aprenderá cómo crear, editar, copiar, mover y eliminar archivos en lotes.
Examples
Creando un archivo en lote
Puede haber varias razones por las que desea crear un archivo de texto por lotes. Pero
cualquiera que sea la razón, así es como lo haces.
@echo off
echo info to save > text.txt
Pero si desea agregar texto a un archivo de texto ya existente, use >> . Ejemplo:
@echo off
echo info to save >> text.txt
@echo off
(echo username
echo password)>text.txt
Es posible que desee copiar archivos de un lugar a otro. En este ejemplo te enseñaremos.
Ejemplo:
@echo off
xcopy C:\Folder\text.txt C:\User\Username\Desktop
También hay interruptores que puede utilizar. Si desea verlos, abra el símbolo del sistema
mediante Start Menu -> Accessories -> Command Prompt y luego escriba xcopy /?
Mover archivos
https://riptutorial.com/es/home 60
Usando el comando mover, puedes mover archivos:
@echo off
cd C:\Foo\Bat\Baz
move /Y Meow.bat "Meow Folder" >nul
Meow.bat representa qué archivo mover. La "Carpeta Meow" mueve Meow.bat a la Meow Folder . /Y
dice no pedir confirmación. Reemplazando eso con /-Y hace que el archivo por lotes solicite
confirmación. El >nul oculta la salida del comando. Si no tuviera >nul , generaría:
1 File Moved
Borrando archivos
Usando el comando DEL (alias para ERASE ), uno puede eliminar archivos.
@echo off
del foo.ext
Este comando eliminará foo.ext del directorio actual. También se puede especificar la ruta y el
archivo, como:
del C:\Foo\Bar\Baz.ext
Pero siempre es ideal poner comillas ( " ) alrededor de las rutas, vea aquí la razón.
Bandera Función
En este ejemplo , el usuario BoeNoe mostró cómo usar el comando xcopy para copiar archivos.
También hay un comando adicional llamado copy .
https://riptutorial.com/es/home 61
Aquí hay un ejemplo simple:
Esto copia foo.ext a bar.ext , y crea bar.ext cuando no existe. También podemos especificar rutas
al archivo, pero siempre es ideal colocar comillas ( " ) alrededor de las rutas, consulte aquí el
motivo.
También hay muchas banderas disponibles para copy , ver copy /? o help copy en un símbolo del
sistema para ver más.
El archivo por lotes no viene con un método incorporado para reemplazar la línea n de un archivo,
excepto replace y append ( > y >> ). Usando for bucles, podemos emular este tipo de función.
@echo off
set file=new2.txt
type "%file%"
pause
exit /b
set /a lineCount=%~2-1
:changeLine
echo %~3>>temp.txt
type temp.txt>%~1
del /f /q temp.txt
endlocal
exit /b
https://riptutorial.com/es/home 62
○ Se realiza un bucle a través de todas las líneas y echo a un archivo temporal antes de
la línea de reemplazo
○ Se hace echo la línea de reemplazo del archivo.
○ Continúa la salida al resto del archivo.
○ Copia el archivo temporal al archivo original.
○ Y elimina el archivo temporal.
https://riptutorial.com/es/home 63
Capítulo 22: Mejores prácticas
Introducción
Este tema se centrará en las cosas que uno debe (no es obligatorio) hacer en un archivo por
lotes. El uso de estas "mejores prácticas" puede mejorar el efecto y la función de un archivo por
lotes.
Examples
Citas
La mayoría de los scripts de lotes en línea vienen con muchos problemas de cotización.
Ejemplos y soluciones
Ejemplo A
Este código funciona: cuando el contenido de %var% no contiene espacio ni otros caracteres
especiales. Ahora supongamos que %var% contiene 1 espacio en blanco. Ahora cmd.exe ve:
Solución A
Al usar comillas, cmd.exe ve el %var% completo (incluido el espacio y los caracteres especiales)
como una sola cadena normal. Sin embargo, este no es el método de comparación más seguro.
El más seguro usa echo , pipe y findstr .
Ejemplo B
cd
https://riptutorial.com/es/home 64
solo cambiaría el directorio a C:\User\Spaced , ya que cd solo acepta un argumento de ruta.
Solución B
Simplemente agregando comillas alrededor de la ruta, el problema se resolvería.
También hay algunos ejemplos que funcionan mejor usando comillas, como el set /a declaración,
etc. Pero cuando se trabaja en cadenas que contienen espacios o caracteres especiales,
generalmente es muy seguro usar comillas.
Código de espagueti
El código de Spaghetti significa un fragmento de código que usa muchas estructuras, a menudo
confusas. Tales como GOTO s, excepciones y código inconsistente.
Ejemplos y soluciones
Ejemplo A
@echo off
set /a counter=0
:Loop
set /a counter=%counter% + 1
echo %counter%
:exit
Este programa viene con muchos saltos, lo que nos hace más difícil saber qué está haciendo
exactamente el script.
Solución A
@echo off
for /l %%G in (0,1,10) echo %%G
Usando menos GOTO , redujimos mucho la cantidad de código, y podemos enfocarnos en el código
real.
https://riptutorial.com/es/home 65
Ejemplo B
Considere las siguientes afirmaciones.
:endGame
if %player1Score% gtr %player2Score% goto :player1wins
if %player1Score% lss %player2Score% goto :player2wins
goto :tie
:player1wins
echo player 1 wins
goto :eof
:player2wins
echo player 2 wins
goto :eof
:tie
echo tie
goto :eof
Este fragmento de código requiere un montón de instrucciones goto y puede ser confuso para
depurar. Para simplificar estas declaraciones, podemos usar el comando de call . Aquí está el
script anterior en una mejor condición.
:endGame
if %player1Score% gtr %player2Score% call :message player 1 wins
if %player1Score% lss %player2Score% call :message player 2 wins
if %player1Score% equ %player2Score% call :message tie
goto :eof
:message
echo %*
goto :eof
Ambos scripts generan exactamente el mismo resultado, pero el nuevo script es mucho más corto
y claro.
https://riptutorial.com/es/home 66
Capítulo 23: Para bucles en archivos por
lotes
Sintaxis
• para / l %% p in (startNumber, increment, endNumber) comando do
• para / f %% p en (nombre de archivo) comando do
• para / f %% p en ("textStrings") do comando
• para / f %% p en ('comando') comando do
• para / r drive: \ path %% p in (set) do command
• para / d %% p en (directorio) comando do
Observaciones
El comando for acepta opciones cuando se usa el indicador /f . Aquí hay una lista de opciones
que se pueden usar:
• tokens=n Elementos numerados para leer de cada línea o cadena para procesar
Examples
Recorriendo cada línea en un conjunto de archivos
Lo siguiente hará eco de cada línea en el archivo C:\scripts\testFile.txt . Las líneas en blanco
no serán procesadas.
https://riptutorial.com/es/home 67
Un ejemplo más avanzado muestra cómo se puede usar la derivación en el ciclo FOR de un
conjunto restringido de archivos para redirigir la ejecución por lotes, mientras se guarda el
contenido buscado en un archivo:
@echo off
setlocal enabledelayedexpansion
:end
echo All tasks completed
exit /b
Tenga en cuenta el tiempo en que las cadenas de comando se dividen en varias líneas de código
y los grupos de comandos están separados por paréntesis
for /r comando for /r se puede usar para visitar recursivamente todos los directorios en un árbol
de directorios y ejecutar un comando.
@echo off
rem start at the top of the tree to visit and loop though each directory
for /r %%a in (.) do (
rem enter the directory
pushd %%a
echo In directory:
cd
rem leave the directory
popd
)
Notas:
Lo siguiente usa una variable con un bucle for para renombrar un grupo de archivos.
SetLocal EnableDelayedExpansion
https://riptutorial.com/es/home 68
set filename=%%~nj
set filename=!filename:old=new!
set filename=Prefix !filename!
set filename=!filename! Suffix
ren "%%j" "!filename!%%~xj"
)
Al definir el nombre de la variable %%j y asociarlo con todos los archivos actuales (*.*) , Podemos
usar la variable en un bucle for para representar cada archivo en el directorio actual.
Cada iteración (o paso) a través del bucle procesa un archivo diferente del grupo definido (que
podría haber sido cualquier grupo, por ejemplo, *.jpg o *.txt ).
En el primer ejemplo, sustituimos el texto: la cadena de texto "old" se reemplaza por la cadena de
texto "new" (si, pero solo si, el texto "old" está presente en el nombre del archivo).
En el segundo ejemplo, agregamos texto: el texto "Prefijo" se agrega al inicio del nombre del
archivo. Esto no es una sustitución. Este cambio se aplicará a todos los archivos del grupo.
En el tercer ejemplo, nuevamente agregamos texto: el texto "Sufijo" se agrega al final del nombre
del archivo. De nuevo, esto no es una sustitución. Este cambio se aplicará a todos los archivos
del grupo.
Iteración
https://riptutorial.com/es/home 69
Capítulo 24: Privilegios elevados en archivos
por lotes
Examples
Solicitud de privilegios elevados en un acceso directo
Muchas tareas requieren privilegios elevados. Puede elevar los privilegios de usuario al nivel de
administrador para su tiempo de ejecución por lotes utilizando un acceso directo:
1. Presione alt + y el archivo por lotes en una carpeta seleccionada para crear un acceso
directo.
https://riptutorial.com/es/home 70
6. Haga clic en "Aceptar" dos veces.
El siguiente archivo por lotes abrirá una solicitud de UAC que le permitirá aceptar privilegios de
administrador elevados para la sesión por lotes. Agregue su código de tareas a :usercode sección
:usercode del lote, para que se ejecuten con privilegios elevados.
@echo off
setlocal EnableDelayedExpansion
:: test and acquire admin rights
cd /d %~dp0 & echo/
if not "%1"=="UAC" (
>nul 2>&1 net file && echo Got admin rights || (echo No admin rights & ^
MSHTA "javascript: var shell = new ActiveXObject('shell.application');
shell.ShellExecute("%~snx0", 'UAC', '', 'runas', 1);close();"))
:: re-test admin rights
echo/ & >nul 2>&1 net file && (echo Got admin rights & echo/) || (echo No admin rights.
Exiting... & goto :end)
:usercode
:: add your code here
echo Performing admin tasks
echo Hello >C:\test.txt
:end
timeout /t 5 >nul
exit /b
Como ejemplo anterior, este script solicita elevación si es necesario. Le pedimos al usuario las
credenciales para evitar el aviso de UAC.
@echo off
https://riptutorial.com/es/home 71
:: check if we have administrative access
:: ------------------------------------------------------------------------
whoami /groups | find "S-1-5-32-544">NUL 2>&1 && goto:gotAdmin
echo/
echo/ Testing administrative privileges
echo/
echo/ Please enter administrative credentials
echo/
:: get user
:: ------------------------------------------------------------------------
set/P user="* User:: "
if "%user%" EQU "" exit/B 1
:: get password
:: ------------------------------------------------------------------------
<NUL set/p=* password& call:getPass pass || exit/B 1
if "%pass%" EQU "" exit/B 1
exit/B 0
:gotAdmin
echo(
echo( You have administrative rights.
echo(
timeout /T 7
exit/B 0
:notAdmin
echo(
echo( Invalid credential or non administrative account privileges
echo(
timeout /T 7
exit/B 1
https://riptutorial.com/es/home 72
:: check if credential has administrative privileges
:: ------------------------------------------------------------------------
:askIsAdmin
SetLocal & set "u=%~1" & set "p=%~2" & set/A ret=1
set "psCmd=powershell -Command "$p='%p%'^|convertto-securestring -asplaintext -force;$c=new-
object -typename system.management.automation.pscredential('%u%',$p^);start-process
'powershell' '-Command "write-host ([Security.Principal.WindowsPrincipal]
[Security.Principal.WindowsIdentity]::GetCurrent(^)^).IsInRole([Security.Principal.WindowsBuiltInRole]:
-credential $c -passthru -wait;""
for /F "usebackq delims=" %%# in (`%psCmd%`) do @set "result=%%#"
echo %result% | find /I "true">NUL 2>&1 && set/A ret=0
EndLocal & exit/B %ret%
exit/B 1
https://riptutorial.com/es/home 73
Capítulo 25: Redirección de entrada y salida.
Sintaxis
• [comando] [[> | >> | <| 2> | 2 >>] archivo]
• [[> | >> | <| 2> | 2 >>] archivo] [comando]
Parámetros
Parámetro Detalles
Observaciones
• Puede agregar tantas redirecciones diferentes como desee, siempre que el símbolo y el
archivo de la redirección permanezcan juntos y en el orden correcto.
Examples
Un ejemplo...
@echo off
setlocal
set /p "_myvar=what is your name?"
echo HELLO!>file.txt
echo %_myvar%!>>file.txt
echo done!
pause
type file.txt
endlocal
exit
https://riptutorial.com/es/home 74
HELLO!
John Smith!
(y debería salir tan rápido que es posible que no pueda ver nada después de la solicitud. Press
any key to coninue... )
¡Este ejemplo hace eco del carácter especial ! en un archivo. Esto solo funcionaría cuando
DelayedExpansion esté deshabilitado. Cuando la expansión retrasada está habilitada, deberá
utilizar tres caracteres y un signo de exclamación como este:
@echo off
setlocal enabledelayedexpansion
echo ^^^!>file
echo ^>>>file
goto :eof
pause
endlocal
exit /b
!
>
como
Escribir en un archivo
@echo off
https://riptutorial.com/es/home 75
cls
echo Please input the file path, surrounded by "double quotation marks" if necessary.
REM If you don't want to redirect, escape the > by preceding it with ^
set /p filepath=^>
REM Successive file writes will overwrite the previous file contents
echo Writing the current directory tree:
> %filepath% tree /A
echo Reading the file
type %filepath%
REM nul is a special file. It is always empty, no matter what you write to it.
echo Writing to nul
type %windir%\win.ini > nul
echo Reading from nul
type nul
https://riptutorial.com/es/home 76
Capítulo 26: Si declaraciones
Sintaxis
• if [/ i] StringToCompare1 == StringToCompare2 (commandA) else (commandB)
Observaciones
Hay algunas sintaxis para elegir en una sentencia if . Usaremos if string1==string2 como
ejemplo.
Sintaxis de 1 línea
• if string1==string2 commandA
• if string1==string2 (commandA)
Sintaxis multilínea
if string1==string2 (
commandA
)
if string1==string2 (
commandA
) else (
commandB
)
https://riptutorial.com/es/home 77
Examples
Comparando números con la declaración IF
SET TEST=0
IF %TEST% == 0 (
echo TEST FAILED
) ELSE IF %TEST% == 1 (
echo TEST PASSED
) ELSE (
echo TEST INVALID
)
Comparando cuerdas
IF "%~1" == "-help" (
ECHO "Hello"
)
donde %1 refiere al primer argumento de la línea de comando y ~ elimina todas las comillas que se
incluyeron cuando se llamó al script.
Comparando Errorlevel
If Errorlevel 1 (
Echo Errorlevel is 1 or higher
REM The phrase "1 or higher" is used because If Errorlevel 1 statement means:
REM If %Errorlevel% GEQ 1
REM Not If %Errorlevel% EQU 1
)
If "%Errorlevel%"=="1" (
Echo Errorlevel is 1
)
El script anterior verificará la variable Errorlevel (incorporada). El operador not puede ser utilizado.
Set "Test=%Errorlevel%"
If "%Test%" == "1" (
Echo Errorlevel is 1
)
https://riptutorial.com/es/home 78
• Descanso
• Eco
• Endlocal
• por
• Si
• Pausa
• Movimiento rápido del ojo
• Rd / Rmdir
• Conjunto
• Título
• Cls
• Ir
• Llaves
• Popd
• Cambio
• Rd / Rmdir
• Md / Mkdir
If exist "C:\Foo\Bar.baz" (
Echo File exist
)
Esto comprueba si el archivo C: \ Foo \ Bar.baz existe. Si esto existe, se hace eco de archivos
existe el Not operador también se puede añadir.
If Defined Foo (
Echo Foo is defined
)
Esto comprobaría si una variable está definida o no. Una vez más, el Not puede utilizarse el
operador.
https://riptutorial.com/es/home 79
Capítulo 27: Utilizando Goto
Introducción
Goto es simple. Mediante el uso de declaraciones goto simples, puede moverse a cualquier lugar
que desee en su código. También se puede usar para hacer funciones (Mostrado en cómo hacer
funciones).
Sintaxis
• goto: Etiqueta
• goto Label
• goto: EOF
Parámetros
Parámetro Detalles
Observaciones
Entonces, en otras palabras, si el número que insertó el jugador es 1, volverá a: Nombre parte del
código.
Examples
Programas de ejemplo
Por ejemplo:
echo Hello!
pause >nul
:Name
echo What Is Your Name
set /p Input=Name:
echo so %Input% Is Your Name, right?
https://riptutorial.com/es/home 80
echo Rename?
echo 1 For Yes
echo 2 For No
set /p Input=Rename:
if %Input%=1 goto Name
Otro ejemplo:
@echo off
echo 1 or 2?
set /p input=Choice:
if %input%=1 goto Skip
echo You Chose 1
pause >nul
echo So time for stuff
pause >nul
echo Random Stuf
pause >nul
:Skip
echo So that's it.
pause >nul
Goto acepta el uso del valor variable para actuar como la etiqueta para ir a.
Ejemplo:
@echo off
echo a = 1
echo b = 2
Sin embargo, debe verificar la entrada para que no vaya a algún lugar que no exista. Ir a una
etiqueta indefinida terminará su script por lotes al instante.
https://riptutorial.com/es/home 81
Capítulo 28: Variables en archivos por lotes
Examples
Declaración
Para crear una variable simple y asignarla a un valor o cadena, use el comando SET :
SET var=10
Aquí, el código declara una nueva variable var con un valor de 10 . Por defecto, todas las
variables se almacenan internamente como cadenas; esto significa que el valor 10 no es diferente
de foo1234 o Hello, World!
Espacios en variables
El lenguaje por lotes considera que los espacios son partes aceptables de los nombres de
variables. Por ejemplo, set var = 10 resultará en una variable llamada var que contiene el valor 10
(note el espacio adicional a la derecha de var y la izquierda de 10).
Además, utilice comillas al unir varias declaraciones con & o | - alternativamente, ponga el
símbolo directamente después del final del valor de la variable:
https://riptutorial.com/es/home 82
Uso
echo %var%
echo !var!
En los archivos por lotes, las variables se pueden usar en cualquier contexto, incluidas partes de
comandos o partes de otras variables. No puede llamar a una variable antes de definirla.
set var=echo
%var% This will be echoed
set var=part1
set %var%part2=Hello
echo %part1part2%
Sustitución Variable
A diferencia de otros lenguajes de programación, en un archivo por lotes una variable se sustituye
por su valor real antes de que se ejecute el script por lotes. En otras palabras, la sustitución se
realiza cuando el script de comandos lee el script en la memoria, no cuando el script se ejecuta
más tarde.
Esto permite el uso de variables como comandos dentro del script, y como parte de otros
nombres de variables en el script, etc. El "script" en este contexto es una línea o bloque de
código, rodeado de paréntesis: () .
¡Pero este comportamiento significa que no puedes cambiar el valor de una variable dentro de un
bloque!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
imprimirá
Hello
Hello
https://riptutorial.com/es/home 83
ya que (como se ve, al ver la ejecución del script en la ventana de comandos) se evalúa para:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
En el ejemplo anterior, el comando ECHO se evalúa como Hello cuando el script se lee en la
memoria, por lo que el script repetirá Hello para siempre, sin embargo, se realizan muchos pasos
a través del script.
La forma de lograr el comportamiento variable más "tradicional" (de la variable que se está
expandiendo mientras se ejecuta el script) es habilitar la "expansión retrasada". Esto implica
agregar ese comando a la secuencia de comandos antes de la instrucción de bucle
(generalmente un bucle FOR, en una secuencia de comandos por lotes), y usar un signo de
exclamación (!) En lugar de un signo de porcentaje (%) en el nombre de la variable:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
imprimirá
Hello
Goodbye
La sintaxis %%a in (1,1,2) hace que el bucle se ejecute 2 veces: en la primera ocasión, la variable
lleva su valor inicial de 'Hola', pero en la segunda pasada a través del bucle, después de haber
ejecutado la segunda La instrucción SET como la última acción en la 1ª pasada, ha cambiado al
valor revisado 'Adiós'.
Ahora, una técnica avanzada. El uso del comando CALL permite al procesador de comandos por
lotes expandir una variable ubicada en la misma línea del script. Esto puede ofrecer una
expansión multinivel, mediante el uso repetido de LLAMADAS y modificadores.
Esto es útil en, por ejemplo, un bucle FOR. Como en el siguiente ejemplo, donde tenemos una
lista numerada de variables:
setlocal enabledelayedexpansion
for %%x in (%*) do (
https://riptutorial.com/es/home 84
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
Salida:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
Tenga en cuenta que la variable !i! primero se expande a su valor inicial, 1, luego la variable
resultante,% 1, se expande a su valor real de c:\MyFiles\test1.txt . Esta es la doble expansión de
la variable i . En la siguiente línea, i es nuevamente doble expandido, mediante el uso del
comando CALL ECHO junto con el prefijo variable %% , luego se imprime en la pantalla (es decir, se
muestra en la pantalla).
En cada paso sucesivo a través del bucle, el número inicial se incrementa en 1 (debido al código
i+=1 ). Por lo tanto, aumenta a 2 en la 2ª pasada a través del bucle, y a 3 en la 3ª pasada. Por lo
tanto, la cuerda hizo eco a la pantalla altera con cada paso.
Cuando se definen múltiples variables al comienzo del lote, se puede usar una forma de definición
corta empleando una cadena de reemplazo .
@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"
_A=good
_D=6
_E=bad
_G=ugly
Observe en el ejemplo anterior, las variables se ordenan alfabéticamente de forma nativa, cuando
se imprimen en la pantalla.
Es posible crear un conjunto de variables que pueden actuar de forma similar a una matriz
(aunque no son un objeto de matriz real) utilizando espacios en la instrucción SET :
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
https://riptutorial.com/es/home 85
echo Get the variable directly: %var%
Resultado:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
También es posible declarar su variable utilizando índices para que pueda recuperar información
específica. Esto creará múltiples variables, con la ilusión de una matriz:
@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%
Resultado:
A
foo bar
123
Get one of the variables directly: foo bar
Tenga en cuenta que en el ejemplo anterior, no puede hacer referencia a var sin indicar cuál es el
índice deseado, porque var no existe en sí mismo. Este ejemplo también utiliza la setlocal
enabledelayedexpansion junto con los puntos de exclamación en !var[%%a]! . Puede ver más
información sobre esto en la Documentación de alcance de sustitución variable .
set var=10
set /a var=%var%+10
echo %var%
La segunda línea no funciona dentro de un bloque de comando utilizado, por ejemplo, en una
condición IF o en un bucle FOR, ya que se necesitaría una expansión retardada en lugar de una
expansión de variable de entorno estándar.
set var=10
set /A var+=10
echo %var%
https://riptutorial.com/es/home 86
El entorno del símbolo del sistema admite valores enteros de 32 bits firmados:
• suma + y +=
• resta - y -=
• multiplicación * y *=
• división / y /=
• módulo de división % y %=
• &
• bitwise o |
• bit a bit NO ~
• XOR a nivel de bit ^
• desplazamiento a la izquierda en modo de bits <<
• desplazamiento a la derecha en modo de bits >>
• ! NO lógico !
• Menos unario -
• agrupando con ( y )
Nota: El operador % debe escribirse en un archivo por lotes como %% para que se interprete como
operador.
En una ventana de indicador de comando que ejecuta el set /A Value=8 % 3 línea de comando set
/A Value=8 % 3 asigna el valor 2 a la variable de entorno Value y adicionalmente genera 2 .
En un archivo por lotes se debe escribir set /A Value=8 %% 3 para asignar el valor 2 a la variable de
entorno Value y no se genera nada, respectivamente, para manejar STDOUT (salida estándar).
Un set /A Value=8 % 3 líneas set /A Value=8 % 3 en un archivo por lotes daría como resultado un
mensaje de error. Falta el operador en la ejecución del archivo por lotes.
Por esa razón, se hace referencia al valor de una variable con %variable% o con !variable! no es
necesario cuando el nombre de la variable consiste solo en caracteres de palabra (0-9A-Za-z_),
donde el primer carácter no es un dígito, lo que es especialmente útil dentro de un bloque de
comando que comienza con ( y termina con una coincidencia ) .
Los números se convierten de cadena a entero con la función C / C ++ strtol con base cero, lo que
significa una determinación automática de base que puede fácilmente dar resultados inesperados.
Ejemplo:
set Divided=11
set Divisor=3
https://riptutorial.com/es/home 87
set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor
set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3
set /A Result%%=7
echo -90 %%= 7 = %Result%
set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
Usando el interruptor /p con el comando SET puede definir variables desde una entrada.
https://riptutorial.com/es/home 88
Obtener el valor de varias líneas en un archivo:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt
https://riptutorial.com/es/home 89
Creditos
S.
Capítulos Contributors
No
Aleatorio en archivos
2 SteveFest
por lotes
Añadir retraso al
3 SteveFest, Tearzz, wizzwizz4
archivo por lotes
Archivo de lote
4 argumentos de línea DavidPostill, LotPings, npocmaka, sambul35
de comando
Buscar cadenas en
6 sambul35
lote
Cambiando
7 directorios y listando Aravind .KEN, SomethingDark, SteveFest, wizzwizz4
sus contenidos
Diferencias entre
10 Batch (Windows) y SomethingDark, SteveFest
Terminal (Linux)
Errores en el
13 SteveFest, X. Liu
procesador cmd.exe
https://riptutorial.com/es/home 90
Escapar de
14 personajes npocmaka, SteveFest
especiales
Evitar las
limitaciones
15 npocmaka
aritméticas en los
archivos por lotes.
Macros de archivos
19 SteveFest
por lotes
Manejo de archivos
21 BoeNoe, LeoDog896, SteveFest
en archivos por lotes
Privilegios elevados
24 DavidPostill, elzooilogico, sambul35
en archivos por lotes
Redirección de
25 cascading-style, SomethingDark, SteveFest, wizzwizz4
entrada y salida.
https://riptutorial.com/es/home 91