Existe-t-il un équivalent Windows CMD de l'exec du shell Unix?

9

Existe-t-il un équivalent dans Windows à "exec" d'Unix Shell? Fondamentalement, je dois éviter de bifurquer un nouveau processus, afin que les canaux d'entrée / sortie soient préservés, ainsi que l'identifiant du processus.

Éditer:

Alors, voici mon problème. J'ai un processus A qui démarre un script, et ce script se termine par l'exécution d'un processus B. J'ai besoin pour A d'obtenir toutes les sorties de B, ainsi que de pouvoir tuer B en tuant le processus qu'il a engendré (le script) .

Sous Unix, l'exécution de B avec execfait ce travail.

Daniel C. Sobral
la source
Il n'y a pas d'équivalent, du moins n'utilisant pas les commandes et programmes Windows standard.
John Gardeniers
Si vous essayez d'exécuter un exécutable, plutôt qu'un autre fichier batch, il n'y a aucun moyen (pris en charge / réaliste) de le faire. Cependant, les canaux d'entrée / sortie sont normalement hérités par les applications s'exécutant dans un fichier de commandes. Si vous pouvez expliquer pourquoi vous souhaitez procéder ainsi, nous pourrons peut-être suggérer des alternatives.
Harry Johnston
Le processus A devrait déjà obtenir toutes les sorties de B, sauf si le script l'emporte. Ça ne marche pas?
Harry Johnston
Il est possible d'utiliser l'API Win32 pour arranger la mort d'un processus enfant lorsque le processus parent le fait, mais il n'y a pas d'option de ligne de commande intégrée AFAIK. Si je fournis du code source (pour Visual C ++), pouvez-vous le construire?
Harry Johnston
@ Harry, je bifurque le script à partir de Java, donc, si l'idée est que le processus A utilise cette API Win32, je crains que cela ne fonctionne pas, bien que je sois reconnaissant de l'effort. Mieux vaut simplement expliquer que ce n'est pas possible, et je l'accepterai comme réponse.
Daniel C.Sobral

Réponses:

7

AFAIK il n'y en a pas. Windows manque de execv()savoir comment bash exec le fait. callfonctionne pour appeler des fichiers batch (facile, il suffit d'interpréter le fichier dans l'interpréteur actuel, similaire à la .commande bash ) mais pas pour les exes.

Cela rend impossible l'écriture de scripts wrapper à une ligne pour les scripts dans n'importe quelle langue sous Windows. Vous obtiendrez toujours ce "Terminer le travail par lots?" merde sur Ctrl + C et tuer le processus par lots (pas avec Ctrl + C, du gestionnaire de tâches disent) ne tuera pas le processus enfant. Je cherche maintenant un fichier de modèle C pour faire ce wrapping.

MISE À JOUR: Windows a _execv()sa couche de compatibilité POSIX dans MSVCRT, mais AFAIK (ne l'a pas testé) c'est juste un wrapper CreateProcessdonc il créera toujours un nouveau processus, il ne peut pas remplacer le processus actuel.

capr
la source
2

Je pense que l' appel fait ce que vous voulez, mais je ne suis pas sûr à 100%.

Paweł Brodacki
la source
4
Si vous souhaitez exécuter un fichier batch à partir d'un autre, sans lancer une nouvelle instance de cmd.exe, appeler est la bonne réponse.
Harry Johnston
1

Vous pouvez construire une commande batch dynamique et l'exécuter en fonction de la sortie des opérations précédentes. Je ne suis pas sûr que ce serait une solution dans votre cas, mais le code suivant fonctionne très bien.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%
Abdo
la source
cela ne fait rien comme exec...
Jakuje
-1
  • Exécutez des fichiers batch :call
  • Exécuter des fichiers exe : aucune commande nécessaire, appelez-la directement par/path/to/exe/something.exe
solitude
la source