Est-il possible dans un script batch pour garder la console ouverte uniquement lorsqu'elle est invoquée à partir de Windows Manager?
J'ai un DOS script batch qui invoque une application java, qui interagit avec l'utilisateur par le biais de la console de l'INTERFACE utilisateur. Pour la clarté de l'exposé, nous allons l'appeler runapp.bat
et son contenu
java com.example.myApp
Si le lot script est invoqué dans une console, tout fonctionne bien. Toutefois, si le script est appelé à partir de la Fenêtre du Gestionnaire, la nouvelle console se ferme dès que l'application a terminé l'exécution. Ce que je veux, c'est pour la console reste ouverte dans tous les cas.
Je sais les tours suivants:
- ajouter un
pause
commande à la fin du script. C'est un peu moche dans le casrunapp.bat
est appelé à partir de la ligne de commande. - créer un nouveau shell à l'aide de
cmd /K java com.example.myApp
C'est la meilleure solution que j'ai trouvé jusqu'à présent, mais des feuilles supplémentaires de l'environnement de shell lorsqu'il est appelé à partir de la ligne de commande, de sorte que l'appelexit
ne fait pas de fermer le shell.
Est-il un meilleur moyen?
OriginalL'auteur ykaganovich | 2009-02-04
Vous devez vous connecter pour publier un commentaire.
Voir cette question: La détection de la façon dont un fichier de commandes a été exécuté
Ce script ne va pas mettre en pause si vous exécutez à partir de la console de commande, mais si un double-clic dans l'Explorateur:
OriginalL'auteur Patrick Cuff
Je préfère utiliser
%cmdcmdline%
telle que publiée dans le commentaire de Patrick en réponse à l'autre question (qui je ne l'ai pas bien regardé). De cette façon, même si quelqu'un décide d'utiliser des guillemets pour appeler le script batch, il ne se déclenche pas les faux positifs.Ma solution finale:
OriginalL'auteur ykaganovich
va faire le travail. Le & exécuter la commande, l'un après l'autre. Si vous utilisez des && vous pouvez rompre si l'on échoue.
OriginalL'auteur Totonga
Inclure cette ligne dans un fichier de commandes et double-cliquez sur le fichier de commandes dans l'explorateur:
cmd /k "commandes de script au sein de ces citations séparées par des &&"
Par exemple
cmd /k "cd ../.. && dir && cd some_directory"
La totalité des options de cmd peut être trouvé ici
OriginalL'auteur tjb
J'ai souvent recours à d'autres coquillages (principalement TCC/LE de jpsoft.com) et sous-coquille. J'ai trouvé que ce code fonctionne pour un plus large, plus général (et il ne nécessite pas FINDSTR):
Au début, j'avais utilisé
if /i "%~f2"=="%~f3"
dans le_is_similar_command
sous-routine. Le changement deif /i "%~$PATH:2"=="%~$PATH:3"
et les autres le code de vérification pour les NULS extensions permet au code du travail pour les coques/sous-coquille ouvert avec les chemins d'accès complets (par exemple, sous-coquille appelée avec juste "cmd.exe" ou "cci"). laPour les arguments sans les extensions, ce code n'est pas d'analyser et d'utiliser les extensions à partir de %PATHEXT%. Il ignore le plus souvent la hiérarchie des extensions CMD.exe utilise lors de la recherche pour une commande sans l'extension (première tentative FOO.com puis FOO.exe puis FOO.chauve-souris, etc.). Donc,
_is_similar_command
vérifie pour la ressemblance, pas d'équivalence entre les deux arguments des commandes shell. Cela pourrait être une source de confusion ou d'erreur, mais, en toute probabilité, jamais comme un problème, dans la pratique, pour cette application.Edit: code Initial était une vieille version. Le code est maintenant mis à jour à la version la plus récente qui a: (1) un échangés
%COMSPEC%
et%cmdcmdline%
dans l'appel initial, (2) ajout d'une vérification pour plusieurs%cmdcmdline%
arguments, (3) l'écho des messages sont plus spécifiques au sujet de ce qui est détecté, et (4) une nouvelle variable%_PAUSE_NEEDED%
a été ajouté.Il convient de noter que
%_FROM_CONSOLE%
est définie spécifiquement, si le fichier de commandes a excecuted directement à partir de la console de ligne de commande ou indirectement par l'intermédiaire d'explorer ou d'autres moyens. Ces "autres moyens" peut inclure un perl appel system() ou par l'exécution d'une commande telle quecmd /c COMMAND
.La variable
%_PAUSE_NEEDED%
a été ajoutée afin que les processus (tels que perl) qui exécutez le fichier de commandes indirectement pouvez contourner les pauses dans le fichier de commandes. Cela pourrait être important dans les cas où la production n'est pas canalisée vers le visible de la console (par exemple,perl -e "$o = qx{COMMAND}"
). Si une interruption se produit dans un tel cas, le message "Appuyez sur n'importe quelle touche pour continuer . . ." pause invite à ne jamais être affiché à l'utilisateur et le processus va se bloquer en attente pour spontanées saisie de l'utilisateur. Dans les cas où l'interaction de l'utilisateur n'est pas possible ou n'est pas autorisé, le%_PAUSE_NEEDED%
variable peut être réglé à "0" ou "1" (faux ou vrai, respectivement).%_FROM_CONSOLE%
est toujours correctement définies par le code, mais la valeur de%_PAUSE_NEEDED%
n'est pas par la suite basées sur%_FROM_CONSOLE%
. Il est juste passé à travers.Et également à noter que le code de détecter à tort de l'exécution indirecte (
%_FROM_CONSOLE%
=0) dans un shell interne est exécuté que si shell interne est exécuté est ouvert avec une commande contenant des commutateurs/options (par exemple,cmd /x
). En général, ce n'est pas un gros problème en tant que sous-coquille sont généralement ouvert sans supplément de commutateurs et%_PAUSE_NEEDED%
peut être réglé à 0, lorsque cela est nécessaire.Mise en garde codor.
OriginalL'auteur rivy
@echo %CMDCMDLINE% | find /I "/c " >nul && pause
OriginalL'auteur Dave Brown