execution - off - lenguaje batch
Cómo ejecutar secuencias de comandos por lotes sin usar la extensión*.bat (3)
¡Este es un tema interesante para mí! Quiero hacer algunas observaciones al respecto.
El punto importante primero: Un archivo por lotes es un archivo con extensión .BAT o .CMD. Período. Los archivos por lotes pueden lograr, además de la ejecución de los comandos habituales de DOS, ciertas instalaciones específicas de archivo por lotes, en particular:
- Acceda a los parámetros del archivo por lotes mediante% 1% 2 ... y ejecute el comando SHIFT.
- Ejecución del comando GOTO.
- Ejecución del comando CALL: NAME ( subrutina interna ).
- Ejecución de los comandos SETLOCAL / ENDLOCAL.
Ahora, la parte divertida: cualquier archivo puede redirigirse como entrada para CMD.exe, por lo que los comandos de DOS que contiene se ejecutan de forma similar a un archivo por lotes, con algunas diferencias. El más importante es que las instalaciones anteriores de archivos por lotes NO funcionarán. Se ilustran otras diferencias en el archivo NOT-Batch a continuación (lo llamé BATCH.TXT):
@echo off
rem Echo off just suppress echoing of the prompt and each loop of FOR command
rem but it does NOT suppress the listing of these commands!
rem Pause command does NOT pause, because it takes the character that follows it
pause
X
rem This behavior allows to put data for a SET /P command after it
set /P var=Enter data:
This is the data for previous command!
echo Data read: "%var%"
rem Complex FOR/IF commands may be assembled and they execute in the usual way:
for /L %i in (1,1,5) do (
set /P line=
if "!line:~0,6!" equ "SHOW: " echo Line read: !line:~6!
)
NOSHOW: First line read
SHOW: Second line
NOSHOW: This is third line
SHOW: The line number 4
NOSHOW: Final line, number five
rem You may suppress the tracing of the execution redirecting CMD output to NUL
rem In this case, redirect output to STDERR to display messages in the screen
echo This is a message redirected to STDERR >&2
rem GOTO command doesn''t work:
goto label
goto :EOF
rem but both EXIT and EXIT /B commands works:
exit /B
:label
echo Never reach this point...
Para ejecutar el archivo anterior, escriba: CMD / V: ON <BATCH.TXT El conmutador / V es necesario para habilitar la expansión retrasada.
Las diferencias más especializadas están relacionadas con el hecho de que los comandos en el archivo NOT-Batch se ejecutan en el contexto de la línea de comandos , NO en el contexto del archivo por lotes. Tal vez Dave o jeb podrían dar más detalles sobre este punto.
EDITAR: Observaciones adicionales (batch2.txt):
@echo off
rem You may force SET /P command to read the line from keyboard instead of
rem from following lines by redirecting its input to CON device.
rem You may also use CON device to force commands output to console (screen),
rem this is easier to write and read than >&2
echo Standard input/output operations> CON
echo/> CON
< CON set /P var=Enter value: > CON
echo/> CON
echo The value read is: "%var%"> CON
Ejecute el archivo anterior de esta manera: CMD <BATCH2.TXT> NUL
EDITAR : más observaciones adicionales (batch3.txt)
@echo off
rem Dynamic access to variables that usually requires DelayedExpansion via "call" trick
rem Read the next four lines; "next" means placed after the FOR command
rem (this may be used to simulate a Unix "here doc")
for /L %i in (1,1,4) do (
set /P line[%i]=
)
Line one of immediate data
This is second line
The third one
And the fourth and last one...
(
echo Show the elements of the array read:
echo/
for /L %i in (1,1,4) do call echo Line %i- %line[%i]%
) > CON
Ejecute este archivo de la forma habitual: CMD <BATCH3.TXT> NUL
¡Interesante! ¿No es así?
EDITAR : ¡Ahora, los comandos GOTO y CALL se pueden simular en el archivo NotBatch.txt! Ver esta publicación
Antonio
¿Hay algún método en Windows a través del cual podamos ejecutar un script por lotes sin la extensión * .bat?
Podría ser posible sí, pero probablemente ni de manera fácil =) porque antes que nada ... seguridad. Intento hacer lo mismo hace un año, y hace un mes, pero no encontré ninguna solución al respecto. Podrías intentar hacer lo mismo.
ejecu.cmd
type toLaunch.txt >> bin.cmd
call bin.cmd
pause > nul
exit
luego en toLaunch.txt puesto
@echo off
echo Hello!
pause > nul
exit
solo como ejemplo, "compilará" el código, luego ejecutará el archivo de "salida", que es solo "analizar"
en lugar de analizarlo, también podría cambiar el nombre de uso y tal vez poner un cambio de nombre automático dentro de la secuencia de comandos utilizando dentro toLaunch.txt
ren %0 %0.txt
Espero que haya ayudado!
en mi caso, para hacer que Windows ejecute archivos sin extensión (solo para * .cmd, * .exe) observado, he omitido la variable pathext (en varailbles del sistema) para incluir .cmd. Una vez agregado, no tengo más para ejecutar file.cmd que simplemente file.
variables de entorno -> agregar / editar variable del sistema para incluir .cmd; .exe (por supuesto, su archivo debe estar en la ruta)