programacion por off lotes ejemplos crear como comandos batch bat archivos archivo windows batch-file hidden-features

off - Características ocultas de los archivos por lotes de Windows



como crear un archivo por lotes (30)

¿Cuáles son algunas de las características menos conocidas, pero importantes y útiles de los archivos por lotes de Windows?

Pautas:

  • Una característica por respuesta
  • Brinde una breve descripción de la característica y un ejemplo , no solo un enlace a la documentación
  • Limite las respuestas a la funcionalidad nativa , es decir, no requiere software adicional, como el Kit de recursos de Windows

Aclaración: Nos referimos aquí a los scripts que son procesados ​​por cmd.exe, que es el predeterminado en las variantes de WinNT.

(Ver también: archivos por lotes de Windows: .bat vs .cmd? )


¿No tiene un editor a mano y necesita crear un archivo por lotes?

copy con test.bat

Solo escribe los comandos, presiona enter para una nueva línea. Presione Ctrl-Z y Enter para cerrar el archivo.


Al usar CALL, EXIT / B, SETLOCAL y ENDLOCAL puede implementar subrutinas con variables locales.

ejemplo:

@echo off set x=xxxxx call :sub 10 echo %x% exit /b :sub setlocal set /a x=%1 + 1 echo %x% endlocal exit /b

Esto imprimirá

11 xxxxx

aunque: sub modifica x.


Aritmética de enteros:

> SET /A result=10/3 + 1 4


Buscar y reemplazar al configurar variables de entorno:

> @set fname=%date:/=%

... elimina la "/" de una fecha para su uso en nombres de archivos con marca de tiempo.

y las subcadenas también ...

> @set dayofweek=%fname:~0,3%


Continuación de línea:

call C:/WINDOWS/system32/ntbackup.exe ^ backup ^ /V:yes ^ /R:no ^ /RS:no ^ /HC:off ^ /M normal ^ /L:s ^ @daily.bks ^ /F daily.bkf


Control total sobre la salida con espaciado y caracteres de escape .:

echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>


Creando un archivo vacío:

> copy nul filename.ext


El equivalente de la bash (y otras conchas)

echo -n Hello # or echo Hello//c

que da salida a " Hello " sin una nueva línea final. Un cmd hack para hacer esto:

<nul set /p any-variable-name=Hello

set /p es una forma de pedirle al usuario que ingrese información. Emite la cadena dada y luego espera (en la misma línea, es decir, sin CRLF), a que el usuario escriba una respuesta.

<nul simplemente canaliza una respuesta vacía al comando set /p , por lo que el resultado neto es la cadena de solicitud emitida. (La variable utilizada permanece sin cambios debido a la respuesta vacía).

Los problemas son: no es posible emitir un signo igual inicial, y en Vista los caracteres de espacio en blanco iniciales se eliminan, pero no en XP.


En lugar de ensuciar un script con REM o :: líneas, hago lo siguiente en la parte superior de cada script:

@echo OFF goto :START Description of the script. Usage: myscript -parm1|parm2 > result.txt :START

Tenga en cuenta cómo puede utilizar los caracteres de canalización y redirección sin escapar de ellos.


Escapar de la "fontanería":

echo ^| ^< ^> ^& ^/ ^^


Expansión demorada de variables (con subcadenas lanzadas en buena medida):

@echo off setlocal enableextensions enabledelayedexpansion set full=/u01/users/pax :loop1 if not "!full:~-1!" == "/" ( set full2=!full:~-1!!full2! set full=!full:~,-1! goto :loop1 ) echo !full! endlocal


La pieza% ~ dp0 ya se mencionó, pero en realidad hay más: los caracteres después de ~ definen la información que se extrae.
Ninguna letra da como resultado la devolución del nombre del archivo de parche
d - devuelve la letra de unidad
p - devuelve el camino
s - devuelve el camino corto
x - devuelve la extensión de archivo
Entonces, si ejecuta el script test.bat a continuación desde la carpeta c: / Temp / long dir name /,

@echo off echo %0 echo %~d0 echo %~p0 echo %~dp0 echo %~x0 echo %~s0 echo %~sp0

obtienes la siguiente salida

test c: /Temp/long dir name/ c:/Temp/long dir name/ .bat c:/Temp/LONGDI~1/test.bat /Temp/LONGDI~1/

Y si un parámetro se pasa a su script como en
prueba c: / temp / mysrc / test.cpp
Las mismas manipulaciones se pueden hacer con la variable% 1.

¡Pero el resultado de la expansión de% 0 depende de la ubicación!
En el "nivel superior" del lote, se expande al nombre de archivo del lote actual.
En una función (llamada), se expande al nombre de la función.

@echo off echo %0 call :test goto :eof :test echo %0 echo %~0 echo %~n0

La salida es (el archivo por lotes se inicia con myBatch.bat)

myBatch.bat :test :test myBatch


La ruta (con la unidad) donde está el script: ~ dp0

set BAT_HOME=%~dp0 echo %BAT_HOME% cd %BAT_HOME%


No estoy seguro de cuán útil sería esto en un archivo por lotes , pero es un comando muy conveniente para usar en el símbolo del sistema:

C:/some_directory> start .

Esto abrirá el Explorador de Windows en la carpeta "some_directory".

He encontrado esto un gran ahorro de tiempo.


No proporciona mucha funcionalidad, pero puede usar el comando de título para un par de usos, como proporcionar el estado de un script largo en la barra de tareas, o simplemente para mejorar la retroalimentación de los usuarios.

@title Searching for ... :: processing search @title preparing search results :: data processing


Para convertir rápidamente un archivo de texto Unicode (16bit / char) en un archivo ASCII DOS (8bit / char).

C:/> type unicodeencoded.txt > dosencoded.txt

como bonificación, si es posible, los caracteres se asignan correctamente.


Para ocultar todos los resultados de un comando, redirigir a> nul 2> & 1.

Por ejemplo, algunos programas de la línea de comandos muestran el resultado incluso si redirecciona a> nul. Pero, si redirecciona la salida como la línea de abajo, se suprimirá toda la salida.

PSKILL NOTEPAD >nul 2>&1

EDITAR: consulte Ignorar la salida de un comando para obtener una explicación de cómo funciona esto.


Poder ejecutar comandos y procesar la salida (como comillas invertidas de ''$ ()'' en bash).

for /f %i in (''dir /on /b *.jpg'') do echo --^> %i

Si hay espacios en los nombres de archivo, use esto:

for /f "tokens=*" %i in (''dir /on /b *.jpg'') do echo --^> %i


Puede encadenar las sentencias if para obtener un efecto como un booleano de corto circuito `y ''.

if foo if bar baz


Salida de una línea en blanco:

echo.


Separadores de mando:

cls & dir copy a b && echo Success copy a b || echo Failure

En la segunda línea, el comando después de && solo se ejecuta si el primer comando es exitoso.

En la tercera línea, el comando después de || solo se ejecuta si el primer comando falló.


Siempre me ha resultado difícil leer los comentarios que están marcados por una palabra clave en cada línea:

REM blah blah blah

Más fácil de leer:

:: blah blah blah


Subcadenas variables:

> set str=0123456789 > echo %str:~0,5% 01234 > echo %str:~-5,5% 56789 > echo %str:~3,-3% 3456


TheSoftwareJedi ya mencionó el comando for, pero lo mencionaré nuevamente porque es muy poderoso.

A continuación se muestra la fecha actual en el formato AAAAMMDD, lo uso al generar directorios para copias de seguridad.

for /f "tokens=2-4 delims=/- " %a in (''DATE/T'') do echo %c%b%a


Un truco para esperar N segundos (no es parte de cmd.exe pero no es un software adicional, ya que viene con Windows), vea la línea de ping. Necesita N + 1 pings ya que el primer ping se apaga sin demora.

echo %time% call :waitfor 5 echo %time% goto :eof :waitfor setlocal set /a "t = %1 + 1" >nul ping 127.0.0.1 -n %t% endlocal goto :eof


ejemplo de resta de cadenas en la date y time para obtener el archivo llamado "YYYY-MM-DD HH: MM: SS.txt"

echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"

Utilizo el color para indicar si mi secuencia de comandos finaliza correctamente, ha fallado o necesita alguna información al cambiar el color del texto y el fondo. Realmente ayuda cuando tiene alguna máquina al alcance de su vista pero bastante lejos

color XY

donde X e Y es un valor hexadecimal de 0 a F , donde X - fondo, Y - texto, cuando X = Y el color no cambia.

color z

cambia el color del texto a ''Z'' y establece un fondo negro, ''color 0'' no funcionará

para nombres de colores llamada

color ?


si la estructura de bloques:

if "%VS90COMNTOOLS%"=="" ( echo: Visual Studio 2008 is not installed exit /b )


El comando FOR ! Aunque odio escribir archivos por lotes, estoy agradecido por ello.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

analizaría cada línea en myfile.txt, ignorando las líneas que comienzan con un punto y coma, pasando el segundo y tercer token de cada línea al cuerpo para, con tokens delimitados por comas y / o espacios. Observe que las declaraciones del cuerpo for hacen referencia a% i para obtener el segundo token,% j para obtener el tercer token y% k para obtener todos los tokens restantes después del tercero.

También puede usar esto para recorrer directorios, contenidos de directorios, etc.


PAUSE

Detiene la ejecución y muestra el siguiente aviso:

Press any key to continue . . .

Es útil si desea ejecutar un lote haciendo doble clic en él en el Explorador de Windows y desea ver la salida en lugar de solo un flash de la ventana de comandos.


PUSHD path

Te lleva al directorio especificado por ruta .

POPD

Lo lleva de vuelta al directorio desde el que "empujó".