12 votes

Comment exécuter un processus en arrière-plan sans garder un fichier batch ouvert ?

J'ai un service Windows (le serveur d'intégration Bamboo) qui exécute un fichier batch en tant que sous-processus (une tâche de construction) de ce script. Dans ce fichier batch, j'aimerais pouvoir lancer un processus (appelons-le workerprocess.exe) et le faire fonctionner en arrière-plan. C'est tout bon, j'ai utilisé :

start "title" /B workerprocess.exe

C'est très bien comme ça. Le problème est que cela retarde ensuite l'achèvement de la tâche de construction. Ainsi, le lot script se termine, mais à cause du sous-processus workerprocess.exe, le service (Bamboo) ne sait pas qu'il a terminé : il attend toujours (et affiche la sortie) du workerprocess.exe.

J'ai regardé dans la documentation de la commande start, et je ne vois rien qui fasse ce que je veux. J'ai vu この質問 mais cela n'a pas vraiment aidé non plus - le service attend toujours que le processus se termine.

Donc je suppose que pour résumer : comment puis-je lancer un nouveau processus à partir d'un lot script de sorte qu'il soit complètement détaché et ne retarde pas tout ce qui se trouve être en attente de la fin de ce lot script.

5voto

npocmaka Points 1141

Pour auto-cacher un script en cours d'exécution, vous aurez besoin de getCmdPid.bat y windowoMode.bat

@echo off

echo self minimizing
call getCmdPid.bat
call windowMode.bat -pid %errorlevel% -mode hidden

echo --other commands--
pause

Tous les scripts liés peuvent être téléchargés et enregistrés sous le nom qui vous convient.

  1. El IEXPRESS solution - comme arguments n'accepte que la commande et ses arguments.

Exemple d'utilisation :

call hidder.bat myBat.bat  myexe.exe
call myexe.exe
  1. SCHTASKS - Il vérifie également s'il a été lancé avec des permissions élevées et, si possible, obtient le PID du processus avec la commande WEVTUTIL.

Exemple d'utilisation :

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"
  1. WScript.Shell - le script est un wrapper complet de 'WScript.script' et toutes les options possibles peuvent être définies par le biais des options de la ligne de commande.c'est un hybride jscript/batch et peut être appelé comme un bat.

Exemple d'utilisation (pour plus d'informations, consultez l'aide avec '-h') :

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 
  1. Win32_ProcessStartup' (Démarrage du processus) - Cette fois, il s'agit d'un hybride WSF/batch avec quelques morceaux de code Jscript et VBScript - mais il renvoie le PID du processus lancé. Si l'ID du processus n'est pas caché, certaines options comme les coordonnées X/Y peuvent être utilisées.

Exemple d'utilisation (pour plus d'informations, imprimez l'aide avec '-h'). Cela demandera le chemin complet de l'exécutable/script s'il n'est pas dans le répertoire de l'utilisateur. %path% :

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindow 0 -title "notepad"
  1. Le . NET . La plupart des options de ProcessStartInfo sont utilisées (mais à la fin j'étais trop fatigué pour tout inclure) :

Exemple d'utilisation (pour plus d'informations, consultez l'aide avec '-h') :

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2voto

Sun Points 5974

Avez-vous essayé Départ caché (HSTART) ? (Coûts 20 $)

Je l'utilise personnellement pour exécuter un travail par lots toutes les heures en masquant la fenêtre. Ils mentionnent également que vous pouvez exécuter des commandes séquentiellement en tant que paramètre (ou par défaut, je suppose) exécuter de manière asynchrone. Je ne sais pas comment cela affectera votre contention sur le CPU, la mémoire ou le disque... mais le logiciel vous donne aussi la possibilité d'attendre un certain temps avant d'exécuter l'action.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X