Lancer une commande en tache planifiée après x minutes
Résoluadgm1 Messages postés 289 Date d'inscription Statut Membre Dernière intervention -
Bonjour
Je cherche à ajouter une tache planifiée à la suite d'une commande batch. est il possible une fois une commande lancée d'inscrire dans le planificateur de tache une nouvelle commande qui vient annuler la précédente au bout d'une heure?
Car dans le planificateur je ne vois que la possibilité de créer des tache journalière, hebdomadaire.. à telle heure...; mais pas une tache dans 15minutes, 1heure... à partir de l'instant T actuel.
merci
Windows / Chrome 104.0.5112.81
- Schtasks
- Invite de commande - Guide
- Site x - Guide
- Sites X : Pornhub, YouPorn et Redtube sont de nouveau accessibles en France - Guide
- Commande terminal mac - Guide
- Lancer une application au démarrage windows 10 - Guide
10 réponses
Bonjour,
Si tu veux arrêter un script batch par un autre batch ce n'est pas possible car tu ne pourrais pas identifier de manière précise le batch à arrêter, tu pourrais seulement arrêter tous les processus cmd.exe
Bonjour,
La répétition d'une tâche à intervalles programmés s'effectuait historiquement par AT qui est une commande pour Windows 2000 et peut-être XP, je ne me souviens plus, et dorénavant dépréciée. https://www.computerhope.com/at.htm
Van der Woude propose des utilitaires alternatifs: https://www.robvanderwoude.com/ntat.php
Certaines commandes historiques fonctionnent dans les versions plus récentes dès lors qu'existe un exécutable associé (c'est le cas de DIRUSE), mais je ne crois pas que ce soit le cas de AT.
AT a été remplacé dans les versions récentes de Windows par SCHTASKS, mais il ne s'agit évidemment que de répétition de la même tâche, elle programmable à l'envi: https://ss64.com/nt/schtasks.html
Un certain nombre d'utilitaires permettaient là aussi historiquement à peu près toutes les fantaisies en matière de Date, par exemple le très puissant FDATE, mais c'est du Dos 16 bits pur et dur, ce qui signifie en français qu'il n'y a aucun moyen de le faire fonctionner sous une architecture Windows 64 bits sauf éventuellement à passer par un émulateur Dos: https://archive.org/details/freesoftwarefordos_batch_fdate2
Il n'y a aucun moyen d'annuler les effets d'un batch sauf dans certains cas d'y prévoir des instructions conditionnelles et/ou de rediriger le premier batch vers d'autres (par exemple via CALL) selon des conditions particulières et bien sûr dans le cas général de programmer à des heures adaptées un deuxième batch qui viendra inverser les modifications du premier.
On ne sait rien de ce que doivent faire les batchs en question, on en perçoit mal l'intérêt d'une manière générale; s'ils s'agit d'adopter telle configuration selon Windows et mettant en jeu le registre, on a plus vite fait de disposer sur le bureau ou ailleurs de 2 fichiers REG aux effets inverses l'un de l'autre.
On a bien sûr un moyen graphique capillotracté d'aboutir au même résultat.
Il suffit de programmer la tâche X à commencer par exemple à 9h00 et la tâche -X à 9h15 et de répéter chacune des tâches toutes les 30 mn, en résultant l'exécution en alternance de la tâche est de son inverse toutes les 15 mn.

salut. merci mais ce n'est pas ce que je cherche. puisque dans ce cas c'est un horaire prédéfini de la journée qui est paramétré or j'aimerai que le lancement se fasse dans 1 h à partir de maintenant. donc s'il est 10h00 la tache se lance à 11h. mais s'il est 13h la tache doit se lancer à14h. Tout dépend du moment de création de tache. Tache créée au moment T, action à réaliser au moment T+1h.
merci pour vosreponse. Merci brucine pour à nouveau me venir en aide :)
en fait ma demande fait suite à un autre post que j'ai créé pour insérer un mot de passe admin dans un batch chose que j'ai résolu grace à psexec (même si je dois avoir 2 fichiers pour faire l'action voulu)
Donc mon idée c'est de lancer une commande qui bloque l'accès au navigateur dans le parefeu puis de le réactiver au bout d'un certains temps, par exemple 1H.
commande 1 ; netsh advfirewall firewall add rule action=block profile=any protocol=any enable=yes direction=%%x name=chrome program="C:\Program Files\Google\Chrome\Application\chrome.exe
commande 2 ; netsh advfirewall firewall delete rule name=chrome
Pourquoi faire cela? Car si on lance la premiere commande et que personne ne pense à lancer la deuxieme, alors l'acces internet est bloquer pour tout utilisateur se connectant au PC, meme si le PC est redémarré la regle du parefeu est conservée.
Pourquoi passer par une tache planifiée? parce que si je met une commande wait dans le meme batch et que l'utilisateur ferme la fenetre CMD alors la tache inverse ne pourra pas avoir lieu.
voila pourquoi il me semble plus pertinent de planifier une tache directement à la sortie du batch pour que quoi qu'il arrive , au bout du temps imparti, l'appli se réactive bien
Et je vois que le planificateur ne permet pas cette fonction : a partir de maintenant lancer un compte a rebours au bout du quelle telle commande sera lancée.
Après s'il existe un logiciel permettant cette coupure temporelle ce serait bien aussi. J'ai trouvé par exemple NetDisabler qui permet bien de bloquer internet mais le soucis c'est qu'il ne permet pas un retour automatique à la normale au bout d'un certain temps.
Bonjour,
Peut-être en mettant une commande SLEEP en sandwich de chacune des opérations et à condition qu'elle accepte t=216000, mais ce ne sera plus une tâche planifiée mais un batch puisqu'on ne voit pas bien comment programmer une tâche planifiée à un heure de démarrage aléatoire.
https://ss64.com/nt/sleep.html
Le hic, c'est que SLEEP n'est pas par défaut sous Windows, il faut aller le chercher dans le 2003 Resource Kit:
https://web.archive.org/web/20200804140756/https://www.microsoft.com/en-us/download/details.aspx?id=17657
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour,
Voilà un script permettant de créer une tâche planifiée s'exécutant à T + 1 heure :
@echo off for /f "tokens=1,2 delims=:" %%A in ('time /t') do set /a heure=%%A + 1 & set "minute=%%B" SCHTASKS /Create /SC ONCE /TN EnableApp /TR "%USERPROFILE%\Desktop\Transfert_FTP.cmd" /ST %heure%:%minute% /RL HIGHEST /F pause exit
hello. petit bug avec cette commande qui coince dans certains cas. S'il est 13h45 pas de pb avec 'set heure=%%A+1' , la valeur récupérée pour débuter la tâche est 14h45. Mais s'il est 9h45, là il y a erreur car la commande récupère l'heure avec un seul chiffre là où le planificateur de tache attend 2 chiffres. En gros il va récupérer 9:45 mais il manque le zéro pour faire 09:45. il faut absolument un horaire sous la forme HH:MM
Idem pour les minutes s'il est 15h02 et qu'on paramètre la commande 'set minute=%%B+7' pour lancer la tâche dans 7 minutes, cela va calculer un début à 15:9 et donc ça plante. Une idée?
j'ai rajouté une commande if qui semble bien mettre le zéro devant pour les heures à 1 chiffre mais pourtant schtasks ne le prend pas en compte
for /f "tokens=1,2 delims=:" %%A in ('time /t') do set /a heure=%%A+1 & set "minute=%%B"
if "%heure:~0,1%" == " " set heure=0%heure:~0,2%
résultat :
c:\cmd>for /F "tokens=1,2 delims=:" %A in ('time /t') do set /a heure=%A+1 & set "minute=%B"
c:\cmd>set /a heure=08+1 & set "minute=19"
c:\cmd>IF "9" == " " SET heure=09
c:\cmd>SCHTASKS /Create /SC ONCE /TN EnableApp2 /TR "\\scripts\active_internet.bat" /RU "tout le monde" /ST 9:19 /RL HIGHEST /F
Erreur : heure de début incorrecte.
Voilà une solution possible pour l'heure :
@echo off setlocal enableextensions enabledelayedexpansion for /f "tokens=1,2 delims=:" %%A in ('time /t') do set /a heure=%%A+1 & set "minute=%%B" set "heure=0!heure!" & set "heure=!heure:~-2!" set "minute=0!minute!" & set "minute=!minute:~-2!" echo ###!heure!:!minute!### pause
merci pour cette proposition elle m'a l'air adaptée
pour tester j'ai mis 2minutes de délai ; ..... do set /a minute=%%B +2 & set heure=%%A .....
ça fonctionne bien la tache se créé et lance la commande voulu. Me reste à convertir tout ça pour PSEXEC comme ce sera lancé sur un session utilisateur
La commande indique que la tache planifié est bien créée. mais au bout du temps imposé, le batch ne s'exécute pas . En tout cas pas en session utilisateur. C'est ok en admin uniquement. Même en utilisant PSEXEC.
Pas de problème de mon côté, j'arrive à modifier le pare-feu via un script lancé par une tâche planifiée elle-même créée par un script.
Tout ça dans une session utilisateur sans droits admin, mais je suis en local sur un windows 8.1 donc je n'utilise pas Psexec.
-
Est-ce que tu respectes bien les prérequis pour Psexec :
https://www.it-connect.fr/psexec-un-outil-incontournable-pour-les-sysadmins/#IV_Prerequis_de_PsExec
oui pour psexec je n'ai pas de pb j'ai bien respecté les tutos en mettant le chemin dans les variables. Il fonctionne bien sur des sessions utilisateurs. Seul defaut à présent c'est l'execution d'une tache planifiée. Les compte utilisateurs dans mon cas sont dans un domaine (non active directory) avec plusieurs restrictions imposées par le registre
j'ai vu sinon sur un site qu'il faut autoriser les droits d'execution des taches planifiées pour les comptes utilisateurs.
Go to C:\Windows\System32\Tasks find the related task and assign "read and execute" rights to the user you want to be able to access it. Be sure to assign to "current object only." Then the task will be visible and runnable from the limited user, and it will work if you saved your credentials in it and checked "run whether user is logged on or not."
Désolé mais je trouve cela superflu, j'ai refait des tests et je persiste à dire que la solution est l'exécution de la tâche via l'utilisateur SYSTEM.
-
Voilà comment rajouter l'utilisateur SYSTEM dans la création de la tâche :
SCHTASKS /Create /SC ONCE /TN EnableApp /TR "Transfert_FTP.cmd" /RU System /ST %heure%:%minute% /RL HIGHEST /F
Le script sera invisible, aucune fenêtre n'apparaîtra mais le pare-feu sera bien modifié.
j'ai essayé en ajoutant le /RU system mais meme résultat le parefeu n'est pas modifié, la tache est bien créée mais ne se lance pas . Mon script que je planifie est celui ci
psexec -accepteula -u domain\admin -p mdp -d cmd /c \\%logonserver%\netlogon\scripts\active_internet.bat
et le fichier .bat en question est : netsh advfirewall firewall delete rule name=chrome
Rien à modifier dans les conditions ou paramètres de la taches?
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2022-08-18T15:34:56</Date>
<Author>CCLAUDEL\admin</Author>
<URI>\EnableApp</URI>
</RegistrationInfo>
<Triggers>
<TimeTrigger>
<StartBoundary>2022-08-18T15:35:00</StartBoundary>
<Enabled>true</Enabled>
</TimeTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
<UserId>CCLAUDEL\admin</UserId>
<LogonType>InteractiveToken</LogonType>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>\\10.94.49.252\netlogon\scripts\active_internet.bat</Command>
</Exec>
</Actions>
</Task>
du coup je tenterai bien, dans mon script après la commande de creation de tache planifiée d'ajouter des droits en lecture et execution à tout le monde à la tache située dans system32. Mais je sais pas trop comment, en utilisant le nom de la tache j'imagine. Ca donnerait ça ;
icacls C:\windows\system32\tasks\EnableApp /grant "tout le monde":(OI)(CI)(RX,W)
Cela ne me semble pas avoir de rapport, puisqu'il s'agit d'attribuer dans la tâche planifiée des droits pour un utilisateur particulier alors que, a priori, la tâche c'est toi qui l'utilises et que je suppose que tu es administrateur.
Si tant est que cela fonctionne, on tomberait sur les mêmes travers qu'avec Psexec: l'élévation doit être faite avant le lancement du script.
en effet ca na pas fonctionné en ajoutant les droits lecture/ecriture pour tout le monde à la tache planifiée. ni même en ajoutant les droits au dossier tasks de system32.
En fait les commandes sont toujours lancés par des compte utilisateurs standard et non pas en admin. D'où l'utilisation de psexec qui permet d'élever les droits. ca marche bien pour les taches lancées en direct (un fichier .bat) mais ca coince quand l'utilisateur standard essaye de lancer la tache planifiée qui est pourtant bien créee (celle qui active le navigateur en supprimer les regles du parefeu)
en fait j'ai 2 batch l'un et l'autre ayant des fonction inverse. a savoir bloquer une application via le parefeu, puis le second qui réactive l'application en la supprimant des blocage du parefeu. donc l'idée c'est une fois l epremier batch lancé il y a le second qui vient s'insérer dans une tache planifiée pour du coup revenir à l'état initial (appli fonctionnelle)
grosso modo je cherche un outil qui désactive internet pendant 1h ou 2h, puis se réactive automatiquement après le délai imposé
Comment est lancé le premier batch de blocage ?
il est lancé via un fichier .bat à distance à l'aide de psexec, à l'aide d'une appli de prise en main type veyon