Existe um equivalente do Windows CMD para o exec do shell do Unix?

9

Existe algum equivalente no Windows ao "exec" do Unix Shell? Basicamente, preciso evitar a bifurcação de um novo processo, para que os tubos de entrada / saída sejam preservados, bem como a identificação do processo.

Editar:

Então, aqui está o meu problema. Eu tenho um processo A que inicia um script, e esse script termina executando um processo B. Eu preciso que A obtenha toda a saída de B, além de poder matar B matando o processo que gerou (o script) .

No Unix, a execução de B com execfaz esse trabalho.

Daniel C. Sobral
fonte
Não há equivalente, pelo menos não usando comandos e programas padrão do Windows.
John Gardeniers
Se você estiver tentando executar um arquivo executável, em vez de outro arquivo em lotes, não há maneira (suportada / realista) de fazer isso. No entanto, os pipes de entrada / saída normalmente são herdados pelos aplicativos em execução em um arquivo em lotes. Se você pode descrever por que deseja fazer isso, podemos sugerir alternativas.
Harry Johnston
O processo A já deve obter toda a saída de B, a menos que o script substitua isso. Isso não está funcionando?
Harry Johnston
É possível usar a API do Win32 para organizar a morte de um processo filho quando o processo pai ocorre, no entanto, não há opção de linha de comando interna AFAIK. Se eu fornecer algum código-fonte (para Visual C ++), você poderá compilá-lo?
Harry Johnston,
@ Harry Estou bifurcando o script de Java, portanto, se a idéia é para o processo A usar essa API do Win32, receio que seja improvável que funcione, embora seja grato pelo esforço. Melhor apenas explicar que não é possível, e aceitarei isso como resposta.
Daniel C. Sobral

Respostas:

7

AFAIK não existe. Falta ao Windows, execv()e é assim que o bash exec faz isso. callfunciona para chamar arquivos em lote (fácil, basta interpretar o arquivo no intérprete atual, semelhante ao .comando do bash ), mas não para exes.

Isso torna impossível escrever scripts de wrapper de uma linha para scripts em qualquer idioma no Windows. Você sempre receberá a mensagem "Terminar trabalho em lotes?" porcaria em Ctrl + C e matar o processo em lote (não com Ctrl + C, do gerente de tarefas, por exemplo) não matará o processo filho. Agora estou procurando um arquivo de modelo C para fazer isso.

ATUALIZAÇÃO: O Windows tem _execv()em sua camada de compatibilidade POSIX no MSVCRT, mas o AFAIK (não o testou) é apenas um invólucro, CreateProcessportanto sempre criará um novo processo, não poderá substituir o processo atual.

capricho
fonte
2

Acho que ligar faz o que você quer, mas não tenho 100% de certeza.

Paweł Brodacki
fonte
4
Se você deseja executar um arquivo em lotes de outro, sem iniciar uma nova instância do cmd.exe, a chamada é a resposta certa.
Harry Johnston
1

Você pode construir um comando em lote dinâmico e executá-lo com base na saída das operações anteriores. Não tenho certeza se isso seria uma solução no seu caso, mas o código a seguir funciona perfeitamente.

SET yourDynamicCommand=SET var=1
%yourDynamicCommand%
ECHO var's value is %var%
Abdo
fonte
isso não faz qualquer coisa como exec...
Jakuje
-1
  • Execute arquivos em lote :call
  • Executar arquivos exe : nenhum comando é necessário, chame-o diretamente/path/to/exe/something.exe
leonheess
fonte