Tache planifiée en pause sur une période donnée
Résolu/Fermébarnabe0057 Messages postés 14452 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 3 août 2024 - 12 mars 2023 à 14:28
- Tache planifiée en pause sur une période donnée
- Tâche noire sur l'écran qui s'étale progressivement telephone ✓ - Forum Téléphones & tablettes Android
- Cmd pause ✓ - Forum Windows
- Imprimante hp en pause ✓ - Forum Imprimante
- Mettre tamagotchi en pause - Forum Jeux vidéo
- Deplacer barre de tache windows 11 - Guide
14 réponses
23 oct. 2022 à 16:38
Bonjour,
On ne sait pas trop si les PC sont physiquement éteints et si les 2 tâches planifiées sont lancées à partir d'un ordinateur central pour l'ensemble du parc ou bien sur chaque PC.
Dans le premier cas, même éteints, on peut utiliser la fonction Wake on Lan si les ordinateurs en sont pourvus, mais il suffit de toute façon de désactiver les tâches déployées en réseau à partir de l'ordinateur central.
Si ces tâches sont maintenant lancées sur chaque PC, il n'y a aucun moyen de le faire s'ils sont éteints, je suppose donc qu'ils sont en veille prolongée.
Le gestionnaire de tâches ne permet de reporter une tâche que pour une durée aléatoire et ne supporte pas des dates de vacances ou autres qu'il ne connaît pas, je ne peux donc pas même en choisissant manuellement ces dates paramétrer celle de début et de fin.
On obtient un peu plus de "finesse" en paramétrant la tâche non pas de manière graphique mais via SCHTASKS à la ligne de commande, mais les choix ne sont que mois, semaine, date de début/date de fin, activer/désactiver, ce qui signifie que je devrai modifier ces 2 tâches sur l'un des deux derniers critères puis les copier sur chaque PC.
Sauf une quantité considérable de PC sur plusieurs sites différents, n'a-t-on pas plus vite fait d'appuyer sur le bouton arrêt de chaque PC ou le débrancher?
24 oct. 2022 à 17:18
Merci pour ta réponse
En fait j'utilise l'application wake on lan de chez aquila, et on peut y planifier les démarrage et arrêt des machines de tout le parc à des heures précises
Le logiciel utilise les fonctions de tâches planifiés de Windows, donc une fois paramètrees les actions se retrouvent dans le planificateur de tâches.
Je suis donc obligé avant chaque vacances de désactiver les tâches de démarrage, puis le réactiver à la fin de vacances
L'idée serait de pouvoir automatiser cela en indiquant à quelles dates désactiver puis réactiver la tâche de démarrage
Par exemple avec une formule de ce type
If date= jjmmaaaa > stop task named "start pcs"
ET cela pendant 15 jours avant de le réactiver
24 oct. 2022 à 19:08
Quelque chose dans ce goût là, je n'ai pas testé?
Commencer par tester le fonctionnement, si ça tourne, il sera temps de peaufiner en entrant les dates de manière interactive et/ou en entrant la seule date de début puis en calculant celle de fin sur la base d'un nombre de jours; si End et Run ne suffisent pas, il faudra modifier les dates via SCHTASKS, ça générera un script un peu plus compliqué.
Remarquer que la date est forcément au format jj/mm/aaaa.
@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 /End /TN nom-de-la-tache
GOTO EOF
:FIN
SCHTASKS /Run /TN nom-de-la-tache
:EOF
26 oct. 2022 à 10:14
ok merci je vais explorer ca
je présume qu il faut plutot indiquer l'emplacement de la tache et non juste le nom. comment je retrouve l'endroit ou est stocké la tache planifié?
pour l instant quand je lance le script ca indique "le fichier specifié est introuvable"
Modifié le 26 oct. 2022 à 10:35
L'emplacement des tâches est par défaut (elles sont stockées dans le registre), mais je crois que j'ai oublié dans la syntaxe que pour l'option /Create le nom peut-être brut de coffrage nom-de-la-tache tandis que pour les autres commutateurs il doit être spécifié entre guillemets "nom-de-la-tache".
Il s'agit bien sûr d'une tâche lancée sur le PC local (le nom n'est pas appelé sur un PC réseau) sans quoi on doit spécifier le commutateur /S:
SCHTASKS /End /S system /TN "nom-de-la-tache"
Il faut spécifier le cas échéant l'utilisateur propriétaire de cette tâche:
SCHTASKS /End /U username /P password /TN "nom-de-la-tache"
Si les syntaxes /Run et /End sont à incriminer (je n'ai pas testé), faire pour tester la syntaxe une création bidon d'une tâche qu'on supprimera après, je ne me fatigue pas, je recopie un exemple au kilomètre:
SCHTASKS /create /tn "On demand demo" /tr "C:\Windows\notepad.exe" /sc ONCE /sd 01/01/1910 /st 00:00
Modifié le 29 oct. 2022 à 02:25
je suis un peu perdu et pas sur d avoir compris. j'ai créé un fichier batch avec les commande proposée mais cela m'indique un fichier introuvable. jen conclue qu'il ne parvient pas a identifier ou se trouve la tache. Le script a un emplacement specifique ? je dois creer le script directement dans le planificateur de tache ou je crée une tache classique avec comme programme à lancer tous les jours le fichier batch?
voici ce que jai fait pour le moment. avec le logiciel wakeonlan je créé en local sur le serveur, 2 tache de planification ; demarrage des pc le matin et arret des pc le soir. elle se situent dans bibliotheque du planificateur>aquila technology>wakeonlan
puis je créé un fichier bat avec la command proposée permettant de stopper la tache de demarrage si telle date est atteinte. dans le planificateur je créé une nouvelle tache avec comme propriété demarrage tous les jours, programme a executer=le fichier batch
29 oct. 2022 à 09:29
Sur la syntaxe, je ne connais pas ton utilitaire de Wake on Lan et je ne sais pas dans quelle mesure la commande SCHTASKS va trouver la tâche si elle n'est pas à la racine de la bibliothèque du planificateur de tâches.
On va commencer par vérifier la syntaxe, on ne sait jamais, commence par créer à la racine du planificateur une nouvelle tâche que je nommerai test; je crée où je veux sur mon disque un fichier message.cmd, puis je spécifie dans Actions à Programme: cmd et à arguments: /C "G:\!Menus\OutilsSys\taches\message.cmd" où ce qui précède message est le chemin de message.cmd sur le disque.
echo "toto"
pause
que tu vas commencer par exécuter manuellement une première fois pour entrer les droits utilisateur appropriés puis planifier par exemple chaque jour à une heure future proche et répéter toutes les 15 mn.
Le fichier batch SCHTASKS n'est destiné dans les circonstances que tu évoques qu'à modifier les conditions d'exécution d'une tâche déjà existante; il est écrit dans un batch pour des raisons de commodité, mais pourrait parfaitement être écrit à la ligne de commandes, en tout cas il ne doit pas être écrit sur le mode poupées russes dans une deuxième tâche puisqu'il ne sera exécuté qu'à la demande en ayant pour effet de modifier une fois pour toutes (en tout cas jusqu'à instruction du contraire par la même voie) les jours d'exécution.
Une fois donc ma tâche test mise en place, je vais créer un deuxième batch que je vais appeler stop.cmd et que je mets là aussi où ça me plaît:
rem @echo off (pour tester, je veux voir ce qu'il se passe)
SCHTASKS /End /TN test
rem je mets aussi une pause pour tester ce qu'il se passe
pause
J'exécute comme administrateur pour vérifier si l'affichage de toto disparaît (et réapparaît si je remplace /End par /Run), j'ajoute au besoin les commutateurs /U et /P si je me fais jeter pour droits insuffisants.
Si cela fonctionne, c'est que la syntaxe n'est pas en cause; on peut alors envisager que ton affaire ne fonctionne pas parce que ta tâche n'est pas à la racine du planificateur, et qu'il faut en spécifier le chemin via /TN "FOLDERPATH\TASKNAME":
En supposant que je veuille m'attaquer par exemple à la tâche qui vérifie que Firefox est le navigateur par défaut et qui se trouve non pas à la racine du planificateur mais dans le dossier Mozilla, j'écris (attention, il me semble que je n'ai droit qu'à 255 caractères)
SCHTASKS /End /TN "Mozilla\Firefox Default Browser Agent 308046B0AF4A39CB"
L'ordinateur d'où est lancée la commande SCHTASKS ne doit pas être en veille lui-même, la commande n'étant pas à même de le "réveiller".
29 oct. 2022 à 09:48
Pardon, j'ai du mal à démarrer, ce matin.
Ce que j'ai écrit concerne le lancement ou l'arrêt manuel.
Si je veux tester une date de début et de fin tous les jours, il va bien falloir que soit je planifie mon batch SCHTASKS sur le modèle de ce qui est <3> en spécifiant au besoin le chemin de la tâche de destination pour qu'il s'exécute tous les jours à l'heure que j'ai choisie, soit si le poste qui l'héberge est éteint la nuit que je la mette dans le menu démarrer.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question29 oct. 2022 à 16:11
ok merci je commence à avancer. En fait la tache etant deja créée par aquila software je dois donc indiquer le chemin comme elle ne s'ajoute pas à la racine de la bibliotheque des taches, à savoir :
SCHTASKS /End /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
cela fonctionne mais le message indique "la tache a été terminée", or ce que je souhaite ce n'est pas d'arréter la tache en cours mais la mettre en pause, la désactiver. Quand on clique droit sur une tache il y a bien cette option. Quelle est la commande batch pour la désactivation d'une tache?
Concernant les commande pour intégrer les periode de vacances je suis pas sûr si j'ai bien compris. Car là aussi ce n'est pas "lancer" la tache pour les periode hors vacances mais juste l'activer, puisque ce sera le logiciel qui lancera la tache pour démarer les PC. Ya t'il une commande d'activation de la tache?
est ce que les commande indiquent bien cela :
if %date% less than %debut% ou greater than %fin% (soit hors periode vacance) alors ne rien faire
sinon (donc entre debut et fin de la periode de vacance) : désactiver la tache de démarrage des pc
Modifié le 29 oct. 2022 à 16:50
oups fallait chercher un peu ! je viens de trouver les commande j'avais essayé avec /disable à la place de /end mais il faut ajouter /change
donc ma commande de désactivation est la suivante
SCHTASKS /change /disable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
pour le moment le batch ne fonctionne pas il doit y avoir un hoc dans la periode de vacance
En gros si c'est faisable voici ccomment j'envisage le batch afin qu'il puisse fonctionner sur toute une année avec la saisie de chacune des 5 périodes de vacances:
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% comprise entre toussaint1 et toussaint2 ou noel1 et noel 2 ou .....
alors lancer la commande SCHTASKS /change /disable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
sinon lancer la commande SCHTASKS /change /enable /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin"
Modifié le 29 oct. 2022 à 17:08
Oui, pourquoi pas.
Disable est en principe après la tâche, je ne sais pas si cela a une importance:
SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /disable (enable pour rétablir)
/End est conçu pour mettre fin à la tâche, je suppose que le résultat est le même (Run pour rétablir).
On n'a pas d'autres leviers d'action en Batch: SLEEP n'assure pas un délai suffisant, TASKKILL tue d'ailleurs non pas la tâche mais le processus associé seulement quand il a démarré.
Plutôt que de faire une conditionnelle et tant qu'à faire à utiliser /change, on pourrait spécifier que dans l'exemple ci-dessus la tâche ne doit plus être exécutée à partir de la date de début de vacances à l'aide du commutateur /ED mais l'être à partir de la date de fin des vacances /SD, mais on risque de l'avoir dans le dos parce que la date de début est plus grande que celle de fin, et c'est de toute façon probablement plus lourd de mettre les dates idoines dans 2 à 4 sentences SCHTASKS.
On peut alternativement utiliser la condition de date que j'ai illustrée en <3>, avec /End ou/Disable.
Si la date courante %DATE% est inférieure stricte LSS à la date de début de vacances, on ne fait rien: EOF.
Dans le cas contraire, on doit aussi vérifier que la date de fin n'est pas dépassée GTR: si c'est le cas, on va à FIN qui lance la deuxième sentence SCHTASKS qui elle réveille le matin.
Entre les deux, on désactive la tâche de réveil et on sort.
Je n'ai pas tenu compte de la deuxième tâche (extinction le soir) parce que si par définition les postes ne sont pas allumés pendant les vacances, ils n'auront pas être éteints.
Toutefois, la tâche correspondante va continuer à être lancée et rendre un message d'erreur; si on est puriste, on peut s'en affranchir en doublant la première sentence SCHTASKS par exactement la même qui cette fois-ci désactivera la tâche du soir.
@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
29 oct. 2022 à 19:19
le /disable ou /enable semble pouvoir etre mis avant ou après
Pour la tache d'extinction je n'ai pas d'interet à la désactiver autant qu'elle reste active tous les jours de l'année comme ca en cas d allumage ponctuel pendant les vacances les pc s'éteindront toujours en soiree
en fait pour que cela donne ce que je souhaite à savoir désactiver le demarrage pendant la periode (entre debut et fin de vacance) il faut inverser le enable et le disable
cela donne
@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
et y a t'il moyen d'intégrer toutes les vacances dans un seul fichier? un peu dans l'idée du post <10>
il faudrait réaliser autant de "set" que de vacances mais apres le LSS et GTR risque de se contredire l'un avec l'autre
aucune commande "compris entre" n'existe en batch?
29 oct. 2022 à 23:33
J'ai raconté ma vie pendant que tu modifiais toi-même ton message, je n'ai pas vu que tu souhaitais le faire d'un coup de fusil pour toute l'année bien que fondamentalement ça ne change pas grand-chose (on modifiera le script une fois par an au lieu d'une fois par trimestre), mais barnabe t'a proposé une solution à cet égard.
Je ne comprends pas ton inversion enable/disable: si on est pendant les vacances scolaires, c'est qu'il faut bien interdire aux PC d'y démarrer le matin?
Sur le reste, je me suis servi pendant très longtemps d'un utilitaire qui faisait des miracles pour le traitement des dates et où Dos n'est pas très bon (et dans lequel on pouvait aussi définir un fichier annexe de jours fériés), mais qui est en Dos 16 bits pur et dur et qui donc ne fonctionnera qu'en émulation sur un système 32 bits, en 64, même pas la peine d'essayer.
A toutes fins utiles (il existe peut-être depuis d'autres utilitaires en Dos émulé gérant la date sur un système 64 bits, je ne me suis plus intéressé à la question depuis):
https://archive.org/details/freesoftwarefordos_batch_fdate2
29 oct. 2022 à 22:09
Bonjour tout le monde,
Je pense que ceci pourra t'aider :
@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" for %%A in (%toussaint% %noel% %hiver%) do call :controleDate "%%~A" echo. & pause exit :controleDate set /a vacances=0 set "today=!DATE:~6,4!!DATE:~3,2!!DATE:~0,2!" rem set "today=20221031" echo. & echo ### %today% ### %~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 vacances=1)) if !vacances! EQU 1 (set action=disable) else (set action=enable) echo SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Demarrer_pc_matin" /!action! echo SCHTASKS /change /TN "Aquila Technology\Wake On LAN\Eteindre_pc_soir" /!action! goto :eof
N'oublie pas d'enlever les ECHO devant SCHTASKS une fois que tu es sûr que tout fonctionne comme tu veux.
29 oct. 2022 à 23:40
wow merci, je vois à peu près ce que fais le script il est bien complet
cependant il semble qu'il fasse la chose à l'envers et active pendant les vacances alors que les commandes semble demander une désactivation. est ce normal? j'ai modifié en inversant action=enable (pour 1) et action=disable (pour 0, c'est à dire else). etonnant mais ca a l'air de fonctionner.
le script detecte vacance =0 bien que j'ai indiqué etre en plein dans la toussaint en modifiant les dates de debut et fin.
On est d'accord que je peux lancer ce script tous les matins? il devrait ainsi redefinir la desactivation ou l'activation de la tache selon la date du jour et la periode de vacance indiquée
Modifié le 30 oct. 2022 à 06:37
Oui tu peux lancer tous les matins.
Je ne pense pas qu'il fasse les choses à l'envers, quand c'est les vacances ( vacances=1 ) il désactive les 2 tâches planifiées. Comme tu l'as précisé précédemment, il serait préférable de ne pas désactiver la tâche qui éteint les pc le soir.
Par défaut vacances=0 donc si jamais il y a un problème dans le script (date mal formatée, etc ...) les tâches restent activées.
Pour faire des tests avec les dates, tu peux modifier la date du jour en agissant sur cette ligne :
rem set "today=20221031"
Il ne faut pas toucher aux variables debutVacances et finVacances.
30 oct. 2022 à 20:39
y a un truc qui cloche. Mes tests je les fait en modifiant la date dans les parametre du pc. Quand le script est executé il indique "la tache planifiée a déja été activée" or normalement il devrait la désactiver puisque je me situe en vacances scolaires
la ligne avec REM n'est pas sensée avoir d'influence sur le script non? comme c'est une remarque.
en tout cas quand je change la date du pc il detecte la bonne date mais le calcul ne semble pas bien se faire et il n'arrive pas à bien savoir si je suis hors vacances ou non.
Est-ce que tu as vérifié si la variable d'environnement %DATE% est mise à jour quand tu modifies la date dans les paramètres du pc ? Moi je dirais que non. Conclusion : ta méthode de test n'est pas fonctionnelle. Concernant le REM il faut bien entendu l'enlever pour pouvoir faire des tests à ta guise.
Modifié le 30 oct. 2022 à 23:10
oui dans la fenetre msdos il est bien indiqué la date du jour. quand je fais echo %date% il me met bien la date au 30decembre par ex. Par contre il me met plusieurs lignes pour chaque vacances. Je suis pas sur que le script identifie bien dans quelle periode de vacance je me situe
voici une video qui montre que la tache reste activée même en periode vacance
https://drive.google.com/file/d/12C4E1XcZFrtNIL_qYQHEzLioZarpRLtZ/view?usp=sharing
jai un doute sur certaines commandes. QUe fait precisément celle ci ?
for /f "tokens=1-6 delims=/-" %%A in ("%~1") do ( set "debutVacances=%%C%%B%%A" set "finVacances=%%F%%E%%D" )
Cette commande formate la date, pour passer de
31/10/2022-06/11/2022 à 20221031 et 20221106
La boucle découpe la chaîne de caractères %~1 (qui vaut par exemple 31/10/2022-06/11/2022) suivant les caractères - et / ce qui donne 6 morceaux de chaînes %%A %%B %%C %%D %%E %%F
-
Je suis pas sur que le script identifie bien dans quelle periode de vacance je me situe
==>> tu m'as mis la puce à l'oreille, je crois savoir d'où vient le problème : le script ne mémorise pas si la date du jour correspond à telle période de vacances.
-
Du coup si la date du jour correspond aux vacances de toussaint ou de noel, le script va ensuite s'attaquer aux vacances d'hiver et annuler ce qu'il a pu faire juste avant.
-
Toutes mes excuses pour cet oubli, voici la correction :
@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 vacances=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 ### Date du jour : !DATE! ### Vacances : %~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 vacances=1)) if !vacances! EQU 1 (set action=disable) else (set action=enable) goto :eof
31 oct. 2022 à 12:19
c'est top!! ca marche nikel. je vais meme ajouter en debut de script toutes les vacances sur quelques années comme ça je suis pas obligé de modifier chaque années les périodes de vacances.
encore merci à vous 2 pour votre aide toujours très précieuse
12 mars 2023 à 14:11
bonjour
j'ai un petit pb avec une nouvelle tache que j'ai créée qui est Demarrer_pc_soir. Quand je l'ajoute dans mon logiciel Aquila et que la rajoute dans le script pour qu'elle s'active ou non selon la periode de vacance j'obtiens ce message :
erreur, le nom de la tache spécifiée "(...)\Demarrer_pc_soir" n'existe pas dans le systeme
une idée? il n'y a pourtant pas d'erreur sur la casse et la tache est bien presente dans le gestionaire d etache
12 mars 2023 à 14:28
bonjour, qu'est-ce que te renvoie cette commande :
schtasks /query /fo table /nh | find /i "Demarrer_pc_soir"
12 mars 2023 à 14:14
12 mars 2023 à 14:23
oups il y avait bien une erreur de casse, un espace à la fin . C'est rétabli