Esiste un equivalente CMD Windows del exec della shell Unix?


9

Esiste un equivalente in Windows al "exec" di Unix Shell? Fondamentalmente, devo evitare di creare un nuovo processo, in modo da preservare i tubi di input / output e l'id del processo.

Modificare:

Quindi, ecco il mio problema. Ho un processo A che avvia uno script e questo script termina eseguendo un processo B. Ho bisogno che A ottenga tutto l'output di B, oltre ad essere in grado di uccidere B uccidendo il processo che ha generato (lo script) .

Su Unix, l'esecuzione di B execfa quel lavoro.


Non esiste un equivalente, almeno non usando i comandi e i programmi standard di Windows.
John Gardeniers,

Se stai cercando di eseguire un eseguibile, piuttosto che un altro file batch, non esiste un modo (supportato / realistico) per farlo. Tuttavia, le pipe di input / output vengono normalmente ereditate dalle applicazioni in esecuzione in un file batch. Se riesci a descrivere perché vuoi farlo, potremmo essere in grado di suggerire alternative.
Harry Johnston,

Il processo A dovrebbe già ottenere tutto l'output di B, a meno che lo script non abbia la precedenza su questo. Non funziona?
Harry Johnston,

È possibile utilizzare l'API Win32 per disporre che un processo figlio muoia quando il processo padre lo fa, tuttavia non esiste un'opzione da riga di comando integrata AFAIK. Se fornisco del codice sorgente (per Visual C ++) sei in grado di costruirlo?
Harry Johnston,

@Harry Sto biforcando lo script da Java, quindi, se l'idea è che il processo A utilizzi quell'API Win32, temo che sia improbabile che funzioni, anche se sono grato per lo sforzo. Meglio solo spiegarlo non è possibile, e lo accetterò come risposta.
Daniel C. Sobral,

Risposte:


7

AFAIK non c'è. A Windows manca il modo in execv()cui bash exec lo fa. callfunziona per chiamare file batch (facile, basta interpretare il file nell'interprete corrente, simile al .comando di bash ) ma non per exes.

Ciò rende impossibile scrivere script wrapper one-liner per script in qualsiasi lingua su Windows. Riceverai sempre "Termina processo batch?" schifo su Ctrl + C e l'uccisione del processo batch (non con Ctrl + C, dire dal task manager) non ucciderà il processo figlio. Ora sto cercando un file modello C per fare questo wrapping.

AGGIORNAMENTO: Windows ha _execv()nel suo livello di compatibilità POSIX in MSVCRT, ma AFAIK (non l'ho testato) è solo un wrapper, CreateProcessquindi creerà sempre un nuovo processo, non può sostituire il processo corrente.


2

Penso che chiamare faccia quello che vuoi, ma non ne sono sicuro al 100%.


4
Se si desidera eseguire un file batch da un altro, senza avviare una nuova istanza di cmd.exe, call è la risposta giusta.
Harry Johnston,

1

È possibile costruire un comando batch dinamico ed eseguirlo in base all'output delle operazioni precedenti. Non sono sicuro che questa sarebbe una soluzione nel tuo caso, ma il seguente codice funziona bene.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%

questo non fa nulla di simile exec...
Jakuje,

-1
  • Esegui file batch :call
  • Esegui file exe : nessun comando necessario, chiamalo direttamente da/path/to/exe/something.exe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.