Eu estava tentando fazer uma recodificação do prompt de comando do Windows em C #. Eu queria saber como o prompt de comando sabe quando esperar que o processo comece a sair e quando não esperar que o processo chamado saia.
Por exemplo, se você digitar no prompt de comando "notepad", o Notepad será iniciado, mas você ainda poderá executar outros comandos. No entanto, se você abrir um utilitário como more.com, ping.exe ou outro utilitário, ele aguardará a conclusão do programa em execução antes de permitir que você execute outro comando.
Como o prompt de comando sabe quando esperar pela saída e como esse comportamento pode ser emulado em C #?
c#
windows
command-prompt
Justin Krejcha
fonte
fonte
Respostas:
Se o aplicativo for um aplicativo Win32 GUI, ele apenas será executado e o prompt de comando não aguardará sua saída.
Se o aplicativo for um aplicativo de console, ele será executado no prompt de comando e você precisará aguardar sua conclusão para obter o prompt de comando de volta.
EDITAR:
ESTÁ BEM. Parece que você precisa de uma explicação técnica. Se você deseja emular o mesmo recurso em seu aplicativo, pode verificar os
IMAGE_OPTIONAL_HEADER
arquivos EXE aqui .Dentro
IMAGE_OPTIONAL_HEADER
, existe:If SubSystem == 0x02
significa que é um aplicativo GUI.If SubSystem == 0x03
significa que é um aplicativo de prompt de comando.EDIT 2:
Se você quiser vê-lo em ação:
Baixe http://www.ntcore.com/exsuite.php
Copie calc.exe ou notepad.exe para sua área de trabalho
Abra calc.exe copiado no CFF Explorer
Navegue até Nt Headers -> Optional Headers
Alterar o subsistema de 0x002 para 0x003
Salve isso
Agora execute o novo calc modificado e você verá o prompt de comando aguardar que ele seja encerrado.
fonte
O padrão em um prompt de comando é gerar o programa GUI em um processo / bifurcação separado. No entanto, você pode executar o bloco de notas (ou outro programa GUI) em linha com seu prompt de comando / script de shell:
Dessa forma, o prompt de comando / script de shell só continua depois que o processo notepad.exe termina.
Espero que ajude, TW
fonte
Quando você inicia um novo processo, um aplicativo GUI neste contexto que realmente funciona fora dos limites do prompt, o prompt não espera. Mas, se você executar um comando que funcione inteiramente dentro dos limites da instância atual de um prompt, ele aguardará.
Portanto, o comando
notepad
apenas inicia o aplicativo Notepad e deixa o controle do aplicativo. Enquanto, o comandoipconfig
é executado em um domínio (não, este não é um domínio de aplicativo ), do prompt.Para generalizar extremamente, quando você usa
Process.Start
em seu equivalente C #, não espere. De qualquer forma, não.fonte