Haga que el archivo por lotes se ejecute en el fondo del símbolo del sistema mientras continúa utilizando el símbolo del sistema

0

Utilizo un indicador de comandos de Windows durante horas al día en el trabajo, y quiero condimentar las cosas. Quiero que el color de mi texto cambie de color cada 1 segundo. Tengo un script por lotes que hace esto.

@echo off
set NUM=0 1 2 3 4 5 6 7 8 9 A B C D E F
for %%x in (%NUM%) do ( 
    for %%y in (%NUM%) do (
        color %%x%%y
        timeout 1 >nul
    )
)

Cambia muy bien el color de mi primer plano o fondo cada segundo. Sin embargo, quiero que este script por lotes se ejecute automáticamente cada vez que abro el acceso directo del símbolo del sistema. Así que en mis propiedades de acceso directo, establezco el "Objetivo" a esto:

Destino de acceso directo:

C: \ Windows \ system32 \ cmd.exe / k auto-change-text-color.bat

Esto funciona como se esperaba, pero como el archivo por lotes se está ejecutando, no puedo usar el símbolo del sistema. Y en cambio, solo veo que el color de fondo cambia de vez en cuando.

¿Hay alguna forma de ejecutar esto en segundo plano y continuar usando el símbolo del sistema mientras los colores cambian?

Si no, ¿hay alguna otra manera de hacer lo que quiero hacer? Tal vez con Java, Perl, o algo más que un archivo por lotes?

Gracias por tu ayuda.

user1776193
fuente

Respuestas:

1

Es un poco complicado, porque no desea que el proceso de cambio de color de fondo intercepte ninguna de las entradas de la consola. Podría agregar la opción / NOBREAK al comando TIMEOUT, de manera que la secuencia de comandos nunca lea la entrada estándar, excepto que aún podría procesar una <CTRL-Break> interrumpir, y pregunte si desea terminar el script. El usuario podría responder con Y y terminar el proceso en segundo plano, pero eso podría resultar confuso si el proceso principal también tiene un script por lotes en ejecución. ¿Qué proceso recibe la entrada?

Puede redirigir la entrada estándar a nul para el proceso en segundo plano, pero TIMEOUT falla si la entrada se redirige.

Modifiqué tu auto-change-text-color.bat para usar un retardo PING en lugar de TIMEOUT, permitiendo así que el stdin sea redirigido a NUL También puse un último comando de COLOR al final para terminar con una combinación de colores más legible.

@echo off
set NUM=0 1 2 3 4 5 6 7 8 9 A B C D E F
for %%x in (%NUM%) do (
  for %%y in (%NUM%) do (
    color %%x%%y
    >nul ping localhost -n 2
  )
)
color 07

El siguiente comando se usa para iniciar la secuencia de comandos en segundo plano con stdin redirigido a nul:

start "" /b cmd /c "auto-change-text-color.bat <nul"

El único efecto secundario extraño es que el proceso de fondo todavía puede recibir <CTRL-Break>, e imprime el mensaje. Terminate batch job (Y/N)?, pero inmediatamente continúa sin esperar entrada. Para que pueda iniciar de forma segura un script por lotes en el proceso principal, emita <CTRL-Break> y obtenga dos mensajes de Terminar, y presione S o N sabiendo que solo el script de proceso por lotes en su proceso principal responderá (termine o no).

dbenham
fuente
1
superuser.com/questions/345602/… también cubre este tema
K7AAY
@ K7AAY - Ooh, interesante. No me di cuenta de que <Ctrl-C> está deshabilitado para el proceso de fondo. Actualicé mi respuesta para reflejar eso solo <Ctrl-Break> trabajos.
dbenham
@dbenham muchas gracias por esto. Pude completarlo a mi gusto gracias a ti. Hice una respuesta por mi cuenta para detallar mi archivo y comando de lote final.
user1776193
@dbenham ¿Se me ocurre una forma de configurar el script o hacer esto de manera que pueda detener o pausar el script (cambio de color) y tal vez incluso volver a iniciarlo? Detenerlo sería suficiente, pero volver a iniciarlo sería doble increíble. Gracias de nuevo por todo. He estado amando esto! i.minus.com/iZC4WapYtRVad.gif
user1776193
@ user1776193 - Muy simple :-) Un pequeño cambio en su bucle: if not exist "somePath\pauseColor.signal" color%%X%%Y. Ahora puede pausar creando el archivo y reanudar eliminando el archivo.
dbenham
1

El siguiente comando hará lo que quieras:

start /b "" "%COMSPEC%" /c auto-change-text-color.bat

Comenzará una instancia de CMD.EXE (o cualquiera que sea tu COMSPEC se está ejecutando en el fondo de la ventana de la consola activa, ejecutando auto-change-text-color.bat hasta que finalice el archivo por lotes, momento en el que el fondo CMD.EXE terminará

Woody
fuente
Cierre, pero hay problemas con el proceso en segundo plano que intercepta la entrada de la consola. Ver mi respuesta
dbenham
Gracias @Woody. Me puse a trabajar de inmediato cuando vi tu respuesta.
user1776193
0

Gracias @dbenham y @Woody por su ayuda. Usando sus respuestas, pude hacer exactamente lo que quería hacer.

Terminé usando esto como mi auto-change-text-color.bat comando, porque al final solo quería que el texto cambiara, quería que continuara para siempre y me deshice de algunos colores que no se veían bien con un fondo blanco (F):

@echo off
:loop
set NUM=0 1 2 3 4 5 6 8 9 A B C
for %%x in (%NUM%) do ( 
    color F%%x
    >nul ping localhost -n 4
)
goto loop

En cuanto a mi acceso directo del símbolo del sistema de Windows, comienza en mi directorio de desarrollo y el "Destino" es:

%COMSPEC% /t:F9 /s /k cd scripts && start /b %COMSPEC% /c auto-change-text-color.bat <nul && cd .. && env

Se abre en el directorio de secuencias de comandos de mi entorno de desarrollo, ejecuta la secuencia de comandos de cambio de color en el fondo que está almacenada en mi carpeta de secuencias de comandos, luego vuelve a la carpeta principal y ejecuta otra configuración de archivo por lotes en todas mis variables de entorno. Es perfecto. ¡Gracias de nuevo!

user1776193
fuente
-1

En Linux, el & amp; (ampersand) se utiliza para ejecutar una tarea en segundo plano. No tengo idea de Win, pero intente C:\Windows\system32\cmd.exe /k auto-change-text-color.bat &

cox
fuente
Tienes razón, no tienes idea en Windows. & No hace lo que hace en Unix, por lo que esta respuesta es inútil. Ver ss64.com/nt/syntax-redirection.html
DavidPostill
Esto no funciona. Si no tiene idea de Windows, ¿por qué publicó esto como una respuesta?
Kit Johnson