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ó".