Tarea programada en pausa durante un período determinado
Resueltobarnabe0057 Mensajes publicados 14329 Fecha de registro Estado Colaborador Última intervención -
Hola,
he creado tareas programadas para encender los equipos al inicio del día y apagarlos al final. Quiero asegurarme de que durante las vacaciones los PCs no se enciendan por la mañana, es decir, pausar o desactivar temporalmente el reinicio de los PCs de tal a tal fecha. Luego, quiero reactivar esta tarea en otro período, y así sucesivamente.
¿Es posible?
gracias
14 respuestas
-
Hola,
No sabemos muy bien si las PCs están físicamente apagadas y si las 2 tareas programadas se inician desde una computadora central para todo el parque o bien en cada PC.
En el primer caso, incluso apagadas, se puede utilizar la función Wake on Lan si los ordenadores lo permiten, pero en cualquier caso, basta con desactivar las tareas implementadas en red desde la computadora central.
Si estas tareas ahora se inician en cada PC, no hay manera de hacerlo si están apagadas, así que supongo que están en modo de suspensión.
El administrador de tareas solo permite posponer una tarea por un tiempo aleatorio y no soporta fechas de vacaciones u otras que no conoce, así que ni siquiera puedo configurar manualmente la fecha de inicio y fin eligiendo esos días.
Se obtiene un poco más de "finura" al configurar la tarea no de forma gráfica sino a través de SCHTASKS en la línea de comandos, pero las opciones son solo mes, semana, fecha de inicio / fecha de fin, activar / desactivar, lo que significa que tendré que modificar estas 2 tareas en uno de los dos últimos criterios y luego copiarlas en cada PC.
A menos que tengamos una cantidad considerable de PC en varios sitios diferentes, ¿no sería más rápido simplemente presionar el botón de apagado de cada PC o desconectarlos? -
Gracias por tu respuesta
De hecho, utilizo la aplicación Wake on LAN de Aquila, y se puede programar el encendido y apagado de las máquinas de todo el parque a horas precisas
El software utiliza las funciones de tareas programadas de Windows, por lo que una vez que se configuran, las acciones aparecen en el programador de tareas.
Por lo tanto, tengo que desactivar las tareas de encendido antes de cada vacaciones, y luego reactivarlas al final de las vacaciones
La idea sería poder automatizar esto indicando en qué fechas desactivar y luego reactivar la tarea de encendido
Por ejemplo, con una fórmula de este tipo
Si fecha= jjmmaaaa > detener la tarea llamada "encender pcs"
Y esto durante 15 días antes de volver a activarla
-
Algo así, no lo he probado?
Comenzar probando el funcionamiento, si funciona, será el momento de perfeccionar ingresando las fechas de manera interactiva y/o ingresando solo la fecha de inicio y luego calculando la de fin en función de un número de días; si End y Run no son suficientes, habrá que modificar las fechas a través de SCHTASKS, lo que generará un script un poco más complicado.Nota que la fecha debe estar necesariamente en formato dd/mm/aaaa.
@echo off SET INICIO=31/10/2022 SET FIN=06/11/2022 IF %DATE% LSS %INICIO% GOTO EOF IF %DATE% GTR %FIN% GOTO FIN SCHTASKS /End /TN nombre-de-la-tarea GOTO EOF :FIN SCHTASKS /Run /TN nombre-de-la-tarea :EOF
-
-
ok gracias, voy a explorar eso
supongo que hay que indicar más bien la ubicación de la tarea y no solo el nombre. ¿cómo encuentro el lugar donde está almacenada la tarea programada?
por ahora, cuando ejecuto el script dice "el archivo especificado no se encuentra"
-
La ubicación de las tareas es por defecto (se almacenan en el registro), pero creo que olvidé en la sintaxis que para la opción /Create el nombre puede ser en bruto "nombre-de-la-tarea" mientras que para los otros conmutadores debe especificarse entre comillas "nombre-de-la-tarea".
Se trata, por supuesto, de una tarea lanzada en el PC local (el nombre no se llama en un PC de red) de lo contrario hay que especificar el conmutador /S:
SCHTASKS /End /S sistema /TN "nombre-de-la-tarea"
Hay que especificar en su caso el usuario propietario de esta tarea:
SCHTASKS /End /U nombredeusuario /P contraseña /TN "nombre-de-la-tarea"
Si las sintaxis /Run y /End son las culpables (no lo he probado), para probar la sintaxis se puede hacer una creación ficticia de una tarea que eliminaremos después, no me esfuerzo, copio un ejemplo a lo grande:SCHTASKS /create /tn "Demostración bajo demanda" /tr "C:\Windows\notepad.exe" /sc ONCE /sd 01/01/1910 /st 00:00
-
-
estoy un poco perdido y no estoy seguro de haber entendido. He creado un archivo batch con los comandos propuestos, pero me indica que no se encuentra un archivo. Concluyo que no puede identificar dónde se encuentra la tarea. ¿El script tiene una ubicación específica? ¿Debo crear el script directamente en el programador de tareas o creo una tarea clásica con el programa a ejecutar todos los días el archivo batch?
aquí está lo que he hecho hasta ahora. Con el software wakeonlan, he creado localmente en el servidor, 2 tareas de programación; el encendido de los PCs por la mañana y el apagado de los PCs por la noche. Se encuentran en la biblioteca del programador>aquila technology>wakeonlan
luego, creo un archivo bat con el comando propuesto que permite detener la tarea de encendido si se alcanza tal fecha. En el programador, creo una nueva tarea con como propiedades el inicio todos los días, programa a ejecutar=el archivo batch
-
Sobre la sintaxis, no conozco tu herramienta de Wake on Lan y no sé en qué medida el comando SCHTASKS encontrará la tarea si no está en la raíz de la biblioteca del programador de tareas.
Vamos a comenzar por verificar la sintaxis, nunca se sabe, empieza por crear en la raíz del programador una nueva tarea que llamaré prueba; creo donde quiera en mi disco un archivo mensaje.cmd, luego especifico en Acciones a Programa: cmd y a argumentos: /C "G:\!Menús\HerramientasSys\tareas\mensaje.cmd" donde lo que precede a mensaje es la ruta de mensaje.cmd en el disco.
echo "toto"
pauseque vas a ejecutar manualmente una primera vez para entrar los permisos de usuario apropiados y luego programar por ejemplo cada día a una hora futura cercana y repetir cada 15 min.
El archivo batch SCHTASKS no está destinado en las circunstancias que mencionas más que a modificar las condiciones de ejecución de una tarea ya existente; está escrito en un batch por razones de comodidad, pero podría perfectamente escribirse en la línea de comandos, en cualquier caso no debe escribirse en modo matryoshka en una segunda tarea ya que solo se ejecutará a demanda con el efecto de modificar una vez por todas (en cualquier caso hasta nueva instrucción por la misma vía) los días de ejecución.
Una vez por lo tanto mi tarea prueba establecida, voy a crear un segundo batch que llamaré stop.cmd y que también colocaré donde me plazca:
rem @echo off (para probar, quiero ver qué sucede)
SCHTASKS /End /TN prueba
rem también pongo una pausa para probar qué sucede
pauseEjecutaré como administrador para verificar si la visualización de toto desaparece (y reaparece si reemplazo /End por /Run), añado si es necesario los conmutadores /U y /P si me rechazan por permisos insuficientes.
Si funciona, es que la sintaxis no es el problema; podemos entonces considerar que tu asunto no funciona porque tu tarea no está en la raíz del programador, y que hay que especificar la ruta a través de/TN "FOLDERPATH\TASKNAME":
Suponiendo que quiera atacar por ejemplo la tarea que verifica que Firefox es el navegador predeterminado y que se encuentra no en la raíz del programador sino en la carpeta Mozilla, escribo (atención, me parece que solo tengo derecho a 255 caracteres)
SCHTASKS /End /TN "Mozilla\Firefox Default Browser Agent 308046B0AF4A39CB"
El ordenador desde el que se lanza el comando SCHTASKS no debe estar en modo de suspensión, ya que el comando no es capaz de "despertarlo".
Perdón, me cuesta empezar esta mañana.
Lo que he escrito se refiere al lanzamiento o la detención manual.
Si quiero probar una fecha de inicio y fin todos los días, tendré que programar mi lote SCHTASKS siguiendo el modelo de lo que es <3>, especificando si es necesario la ruta de la tarea de destino para que se ejecute todos los días a la hora que he elegido, o si el equipo que lo alberga está apagado por la noche, ponerlo en el menú de inicio.
-
-
ok gracias, empiezo a avanzar. De hecho, la tarea ya está creada por Aquila Software, así que tengo que indicar el camino ya que no se añade a la raíz de la biblioteca de tareas, a saber:
SCHTASKS /End /TN "Aquila Technology\Wake On LAN\Iniciar_pc_mañana"
eso funciona, pero el mensaje indica "la tarea ha sido terminada", sin embargo, lo que deseo no es detener la tarea en curso, sino ponerla en pausa, desactivarla. Cuando haces clic derecho en una tarea, efectivamente hay esta opción. ¿Cuál es el comando batch para desactivar una tarea?
En cuanto a los comandos para integrar los períodos de vacaciones, no estoy seguro de si he entendido bien. Porque también aquí no se trata de "lanzar" la tarea durante los períodos fuera de vacaciones, sino simplemente activarla, dado que será el software el que lanzará la tarea para iniciar los PC. ¿Hay algún comando de activación de la tarea?
¿Indican bien los comandos esto:
if %date% less than %debut% o greater than %fin% (es decir, fuera del período de vacaciones) entonces no hacer nada
de lo contrario (por lo tanto, entre el inicio y el final del período de vacaciones): desactivar la tarea de inicio de los PCs
-
¡Ups, había que buscar un poco! Acabo de encontrar los comandos, había intentado con /disable en lugar de /end, pero hay que añadir /change.
Así que mi comando de desactivación es el siguiente:
SCHTASKS /change /disable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
Por el momento, el batch no funciona, debe haber un inconveniente en el periodo de vacaciones.
En resumen, si es posible, aquí está cómo imagino el batch para que funcione durante todo un año con la entrada de cada uno de los 5 periodos de vacaciones:
set toussaint1=30/10/2022
set toussaint2=6/11/2022
set noel1=
set noel2=
set hivers1=
set hivers2=
set paques1=
set paques2=
set ete1=
set ete2=si %date% está entre toussaint1 y toussaint2 o noel1 y noel2 o .....
entonces lanzar el comando SCHTASKS /change /disable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"sino lanzar el comando SCHTASKS /change /enable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
-
Sí, ¿por qué no?
Disable se supone que es después de la tarea, no sé si eso tiene importancia:
SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /disable (enable para restablecer)
/End está diseñado para finalizar la tarea, supongo que el resultado es el mismo (Run para restablecer).
No tenemos otros medios de acción en Batch: SLEEP no asegura un retraso suficiente, TASKKILL mata, además, no la tarea sino el proceso asociado solo cuando ha comenzado.
En lugar de hacer una condicional y ya que estamos usando /change, podríamos especificar que en el ejemplo anterior la tarea no debe ejecutarse a partir de la fecha de inicio de las vacaciones utilizando el conmutador /ED, pero sí a partir de la fecha de finalización de las vacaciones /SD, aunque corremos el riesgo de tenerlo en la espalda porque la fecha de inicio es mayor que la de fin, y de todos modos probablemente es más pesado establecer las fechas adecuadas en 2 a 4 sentencias SCHTASKS.
Alternativamente, podemos usar la condición de fecha que ilustré en <3>, con /End o /Disable.
Si la fecha actual %DATE% es inferior estrictamente LSS a la fecha de inicio de las vacaciones, no hacemos nada: EOF.
En caso contrario, también debemos verificar que la fecha de finalización no ha sido superada GTR: si es así, vamos a FIN que lanza la segunda sentencia SCHTASKS que despierta por la mañana.
Entre ambas, desactivamos la tarea de despertar y salimos.
No he tenido en cuenta la segunda tarea (apagado por la noche) porque si por definición las máquinas no están encendidas durante las vacaciones, no deberían apagarse.
Sin embargo, la tarea correspondiente seguirá ejecutándose y generará un mensaje de error; si somos puristas, podemos evitarlo duplicando la primera sentencia SCHTASKS exactamente igual, que esta vez desactivará la tarea de la noche.
@echo off SET DEBUT=31/10/2022 SET FIN=06/11/2022 IF %DATE% LSS %DEBUT% GOTO EOF IF %DATE% GTR %FIN% GOTO FIN SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /disable SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Eteindre_pc_soir" /disable GOTO EOF :FIN SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /enable SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Eteindre_pc_soir" /enable :EOF
-
-
el /disable o /enable parece poder ser puesto antes o después
Para la tarea de apagado, no tengo interés en desactivarla siempre que permanezca activa todos los días del año, así en caso de un encendido puntual durante las vacaciones, las PC siempre se apagarán por la noche
de hecho, para que esto dé lo que deseo, que es desactivar el inicio durante el período (entre el inicio y el final de las vacaciones), hay que invertir el enable y el disable
esto da
@echo off SET DEBUT=31/10/2022 SET FIN=06/11/2022 IF %DATE% LSS %DEBUT% GOTO EOF IF %DATE% GTR %FIN% GOTO FIN SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /enable GOTO EOF :FIN SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /disable :EOF¿y hay forma de integrar todas las vacaciones en un solo archivo? un poco en la idea del post <10>
debería realizar tantos "set" como vacaciones, pero después el LSS y GTR pueden contradecirse entre sí
¿no existe ningún comando "comprendido entre" en batch?
-
He contado mi vida mientras tú modificabas tu mensaje, no vi que deseabas hacerlo de un solo golpe para todo el año aunque, en el fondo, eso no cambia mucho (modificaremos el script una vez al año en lugar de una vez por trimestre), pero Barnabé te propuso una solución al respecto.
No entiendo tu inversión enable/disable: si estamos en vacaciones escolares, ¿no hay que prohibir que los PC arranquen por la mañana?
Por lo demás, durante mucho tiempo utilicé una herramienta que hacía maravillas para el tratamiento de fechas y donde Dos no es muy bueno (y en la que también se podía definir un archivo adicional de días festivos), pero que está en Dos de 16 bits puro y duro y que, por lo tanto, solo funcionará en emulación en un sistema de 32 bits; en 64, ni siquiera vale la pena intentarlo.
A modo de información (quizás desde entonces existen otras utilidades en Dos emulado que gestionan la fecha en un sistema de 64 bits, no me he vuelto a interesar por el tema desde entonces):
https://archive.org/details/freesoftwarefordos_batch_fdate2
-
-
Hola a todos,
Creo que esto te puede ayudar :
@echo off chcp 65001 >nul setlocal enabledelayedexpansion set "todosLosSantos=31/10/2022-06/11/2022" set "navidad=17/12/2022-03/01/2023" set "invierno=11/02/2023-27/02/2023" for %%A in (%todosLosSantos% %navidad% %invierno%) do call :controlarFecha "%%~A" echo. & pause exit :controlarFecha set /a vacaciones=0 set "hoy=!DATE:~6,4!!DATE:~3,2!!DATE:~0,2!" rem set "hoy=20221031" echo. & echo ### %hoy% ### %~1 for /f "tokens=1-6 delims=/-" %%A in ("%~1") do ( set "inicioVacaciones=%%C%%B%%A" set "finVacaciones=%%F%%E%%D" ) if %hoy% GEQ !inicioVacaciones! (if %hoy% LEQ !finVacaciones! (set /a vacaciones=1)) if !vacaciones! EQU 1 (set action=disable) else (set action=enable) echo SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Iniciar_pc_manana" /!action! echo SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Apagar_pc_noche" /!action! goto :eofNo olvides quitar los ECHO delante de SCHTASKS una vez que estés seguro de que todo funciona como quieres.
-
wow gracias, veo más o menos lo que hace el script, está muy completo
sin embargo, parece que hace las cosas al revés y se activa durante las vacaciones, mientras que las órdenes parecen pedir una desactivación. ¿Es eso normal? He modificado invirtiendo action=enable (para 1) y action=disable (para 0, es decir, else). Es curioso, pero parece que funciona.
el script detecta vacaciones=0 a pesar de que he indicado estar en plena Toussaint modificando las fechas de inicio y fin.
Estamos de acuerdo en que puedo ejecutar este script todas las mañanas? Debería así redefinir la desactivación o la activación de la tarea según la fecha del día y el período de vacaciones indicado
Sí, puedes lanzar todos los días por la mañana.
No creo que haga las cosas al revés, cuando son las vacaciones (vacaciones=1) desactiva las 2 tareas programadas. Como mencionaste anteriormente, sería preferible no desactivar la tarea que apaga los PCs por la noche.
Por defecto, vacaciones=0 así que si hay algún problema en el script (fecha mal formateada, etc...) las tareas permanecen activadas.
Para hacer pruebas con las fechas, puedes modificar la fecha del día actuando sobre esta línea:
rem set "today=20221031"
No debes tocar las variables debutVacances y finVacances.
-
-
hay algo que no cuadra. Mis pruebas las hago modificando la fecha en los parámetros del pc. Cuando el script se ejecuta indica "la tarea programada ya ha sido activada", sin embargo, normalmente debería desactivarla ya que estoy en vacaciones escolares.
la línea con REM no se supone que deba influir en el script, ¿verdad? ya que es un comentario.
en todo caso, cuando cambio la fecha del pc detecta la fecha correcta, pero el cálculo parece no realizarse bien y no logra saber correctamente si estoy en vacaciones o no.
-
Sí, en la ventana de MS-DOS se indica correctamente la fecha del día. Cuando hago echo %date% me muestra bien la fecha al 30 de diciembre, por ejemplo. Sin embargo, me muestra varias líneas para cada periodo de vacaciones. No estoy seguro de que el script identifique correctamente en qué periodo de vacaciones me encuentro.
Aquí hay un video que muestra que la tarea sigue activa incluso en periodo de vacaciones.
https://drive.google.com/file/d/12C4E1XcZFrtNIL_qYQHEzLioZarpRLtZ/view?usp=sharing
Tengo dudas sobre algunos comandos. ¿Qué hace precisamente este?
for /f "tokens=1-6 delims=/-" %%A in ("%~1") do ( set "debutVacances=%%C%%B%%A" set "finVacances=%%F%%E%%D" )-
Este comando formatea la fecha, para pasar de
31/10/2022-06/11/2022 a 20221031 y 20221106El bucle corta la cadena de caracteres %~1 (que vale, por ejemplo, 31/10/2022-06/11/2022) siguiendo los caracteres - y /, lo que da 6 trozos de cadenas %%A %%B %%C %%D %%E %%F
-
No estoy seguro de que el script identifique bien en qué periodo de vacaciones me encuentro
==>> me has puesto en alerta, creo saber de dónde viene el problema: el script no memoriza si la fecha de hoy corresponde a un periodo de vacaciones determinado.
-
Así que si la fecha de hoy coincide con las vacaciones de Todos los Santos o de Navidad, el script luego se atacará a las vacaciones de invierno y anulará lo que pudo haber hecho justo antes.
-
Mis disculpas por este olvido, aquí está la corrección:
@echo off chcp 65001 >nul setlocal enabledelayedexpansion set "toussaint=31/10/2022-06/11/2022" set "noel=17/12/2022-03/01/2023" set "hiver=11/02/2023-27/02/2023" set /a vacaciones=0 for %%A in (%toussaint% %noel% %hiver%) do call :controleDate "%%~A" SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /!action! SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Eteindre_pc_soir" /!action! echo. & pause exit :controleDate if !vacances! EQU 1 (goto :eof) set "today=!DATE:~6,4!!DATE:~3,2!!DATE:~0,2!" rem set "today=20221031" echo. & echo ### Fecha de hoy: !DATE! ### Vacaciones: %~1 for /f "tokens=1-6 delims=/-" %%A in ("%~1") do ( set "debutVacances=%%C%%B%%A" set "finVacances=%%F%%E%%D" ) if %today% GEQ !debutVacances! (if %today% LEQ !finVacances! (set /a vacaciones=1)) if !vacances! EQU 1 (set action=disable) else (set action=enable) goto :eof
-
-
¡es genial! Funciona perfecto. Incluso voy a añadir al principio del script todas las vacaciones de algunos años, así que no tendré que modificar cada año los períodos de vacaciones.
Gracias de nuevo a los dos por su ayuda siempre tan valiosa.
-
hola
tengo un pequeño problema con una nueva tarea que he creado llamada Demarrer_pc_soir. Cuando la añado en mi software Aquila y la agrego en el script para que se active o no según el período de vacaciones, obtengo este mensaje:
error, el nombre de la tarea especificada "(...)\Demarrer_pc_soir" no existe en el sistema
¿alguna idea? no hay ningún error en las mayúsculas y la tarea está bien presente en el administrador de tareas
-
-
Ups, había un error de mayúsculas, un espacio al final. Está corregido.
