Ignorer les pauses lors de l'exécution d'un script batch à partir du planificateur de tâches

2

J'ai un script batch qui est exécuté selon un planning et qui est parfois exécuté manuellement. Ce script a un pause en ce sens qu'un echo Le message ed reste visible lors de l'exécution manuelle du script. En d'autres termes, sans la pause, la fenêtre de la console se ferme automatiquement et l'utilisateur ne sait pas pourquoi.

J'ai trouvé des solutions pour quand un script batch appelle un autre et qui impliquent passage dans un paramètre optionnel qui, le cas échéant, le script ignorera sa pause. Les deux cas nécessitent de changer le script batch.

Existe-t-il un moyen simple d’exécuter le script de traitement par lots avec les pauses désactivées ou ignorées, sans modifier le script lui-même? Peut-être quelque chose comme myBatch.bat --skippauses?

mouseas
la source

Réponses:

1

COUPLE RAPIDE POUR SAUTER LA LOGIQUE DES FICHIERS DE LOTS DEPUIS LE COURANT

COMMENCER: Je ne connais aucun moyen de sauter PAUSE commandes dans un script batch (du moins dans votre cas, pour répondre à vos besoins), à moins que vous n'utilisiez l'une des deux solutions que je vais énumérer ci-dessous de manière plus détaillée. Je ne connais aucun commutateur tel que --skippauses une solution aussi simple en appelant ou en exécutant un script de traitement par lots ne fonctionnerait que pour ignorer PAUSE commandes sans modifier au préalable la logique réelle du script batch pour éventuellement l'accepter comme argument pour NE PAS faire PAUSE commande, mais vous DEVEZ apporter des modifications à la logique de script batch afin que cela fonctionne de cette façon.

SOLUTION 1 (ne change pas le fichier de script batch que vous appelez)

Construire dynamiquement un nouveau script construit de manière dynamique, en respectant la logique du script appelé et en excluant toutes les lignes contenant le PAUSE string (insensible à la casse), puis exécutez le script créé de manière dynamique à la place avec la même logique que le script CALLed moins toutes les LIGNES contenant PAUSEet donc tout PAUSE commandes.

Ajoutez simplement quelque chose de similaire à votre myBatch.bat comme mon exemple ci-dessous et assurez-vous de pointer les répertoires, etc où ceux-ci doivent être. Essentiellement, cela exécutera le FINDSTR /i /v commande contre le script vous CALL, et ensuite le lire ligne par ligne, mais EXCLURE toutes les lignes contenant la chaîne PAUSE qui n'est PAS sensible à la casse, et dirigez-le directement vers un nouveau script batch construit de manière dynamique avec un nom unique que vous exécutez ensuite. CALL contre.

EXEMPLE DE SCRIPT

@ECHO OFF

:: Parse out space from hour part of time and replace with a zero (for hours of 00:00 - 09:59)
SET hh=%TIME:~0,2%
SET hh=%hh: =0%
SET DateString=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%_%hh%%TIME:~3,2%%TIME:~6,2%
SET DynScriptName=%Temp%\NOPAUSE_%~N0_%DateString%.cmd

:: If DynScriptName already exists, just delete it
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"

:: Use FINDSTR to ignore all lines containing "pause" but pipe all other lines to DynScriptName to later CALL/EXECUTE
:: /i switch denotes case insensitivity, /v switch denotes exclude value in results piped to DynScriptName
FINDSTR /i /v "pause" "C:\folder\folder\myBatch.bat">"%DynScriptName%"

:: Call the dynamically built script without PAUSE command lines
CALL "%DynScriptName%"

:: If DynScriptName already exists, just delete it (post cleanup)
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"  
GOTO EOF

CONCLUSION: Ce ( Solution 1 ) devrait répondre à vos deux besoins en particulier:

  1. Vous avez maintenant le moyen de lancer un script construit dynamiquement sans PAUSE commandes basées sur l'exécution d'un script qui construit dynamiquement un nouveau script par rapport à la logique de ce script [contenus], par exécution, mais pour tout exclure PAUSE contenant des lignes et éliminant ainsi la PAUSE commandes de courir.

  2. En outre, cela garantit le script actuel que vous exécutez via CALL N'A PAS BESOIN d'être modifié pour prendre en compte les modifications demandées dans votre demande, car elle en reconstruit dynamiquement une autre, à l'exclusion de ce que vous avez demandé.

  3. En outre, un autre simple solution comme dans Solution 2 (ci-dessous) donne une méthode pour effectivement apporter des modifications au script que vous appelez, si vous souhaitez également envisager cet itinéraire facile, vous avez ma Solution 2 exemple, ainsi que les autres articles concernant les modifications nécessaires à ce niveau.


SOLUTION 2 (change la logique de script de traitement par lots)

Dans votre script avec le PAUSE commande, vous mettriez une étiquette comme celle ci-dessous par exemple. Vous auriez ensuite apposé une étiquette sur la logique juste après le PAUSE commande afin que vous puissiez ajouter IF logique de rechercher le premier argument passé au script lorsqu’il est exécuté.

Juste au dessus du PAUSE étiquette de commande (sens :PauseLabel dans mon exemple) , tu mettrais le IF [%1]==[] GOTO PauseLabel puis la ligne suivante en dessous de laquelle vous mettriez GOTO SkipPause.

Cela indique si le script a été exécuté et si aucun argument n’est passé, puis cliquez sur :PauseLabel et faire ce qui est là, qui est PAUSE. S'il y a TOUT premier argument passé, alors il ira à :SkipPause et faire la prochaine étape, qui est le reste de votre logique sans le PAUSE commander.

De cette façon, les utilisateurs peuvent l’exécuter manuellement toute la journée en double-cliquant dessus (sans lui transmettre d’argument), mais votre travail planifié peut transmettre le premier argument de votre choix (il ne s’agit que d’un argument IF la logique peut simplement confirmer qu'il existe ou si c'est NULL.

Script avec PAUSE commande 1er argument de contrôle et saut exemple logique ci-dessous

<Script logic before PAUSE>

IF [%1]==[] GOTO PauseLabel
GOTO SkipPause

:PauseLabel 
 PAUSE

:SkipPause
 <Rest of your batch logic>

Passer l'exemple d'argument à votre script (où il est planifié)

myBatch.bat SkipPause

Veuillez noter que lorsque vous planifiez le lot, le premier argument peut être SkipPause, dummy, DosEquis ou tout ce que vous voulez que ce soit. La logique avec le IF dit simplement: "Y at-il un argument passé au script quand il a été exécuté, et si oui, allez à :SkipPausesinon, allez à :PauseLabel.

Pimp Juice IT
la source
Bien que cela me permette de sauter des pauses dans le script, vous avez manqué mon exigence concernant le besoin de le faire. sans pour autant modifier le script. J'ai déjà vu (une variante de) cette solution dans un question précédente .
mouseas
Cela ressemble à une excellente solution de contournement (donc +1), mais il manque le simple exigence. J'espérais quelque chose comme un argument de ligne de commande qui utilise un moyen intégré pour désactiver / ignorer / supprimer les pauses. Et il ne semble pas y avoir de telle fonctionnalité pour la console Windows ou le planificateur de tâches.
mouseas
Merci pour votre aide. Si vous modifiez votre réponse pour commencer avec quelque chose comme "Non, il n'y a pas de moyen aussi simple que --skippauses, mais voici quelques solutions de contournement qui accompliront ce que vous avez décrit ... ", je peux le marquer comme accepté.
mouseas