Eu tenho um script em lote que basicamente quero que ele apresente ao usuário uma janela do bloco de notas aberta com um arquivo de configuração para o usuário editar cada vez que executar o script, e quero que o prompt de comando espere até que este programa seja fechado para continuar com execução e execute o programa que usa esse arquivo de configuração.
Quero fazer isso porque não quero receber a entrada do usuário no script em lote com o estilo de comando "set /P" e preciso configurar a análise de leitura e gravação nesse arquivo de configuração que possui muitos valores para inspecionar.
Acredito que o comportamento padrão no Windows ao executar qualquer programa executável é que, para arquivos "exe", ele abrirá o programa em seu próprio processo e controlará imediatamente o script/prompt de comando. Para arquivos de script “bat” e “cmd”, ele executará o script e aguardará até que o controle seja devolvido ao primeiro script ou prompt de comando. Este deve ser o comportamento ao pelo menos chamar o outro script com o comando "CALL" ou chamá-lo diretamente.
Agora, no Linux, acredito que o comportamento padrão para conteúdo executável, que é tanto código de máquina nativo que pode vir sem extensão, quanto scripts como arquivos "sh", são executados de maneira bloqueadora, a menos que você especifique o caractere "e" comercial ("&") em algum lugar na linha de entrada.
Portanto, estou tentando obter o comportamento de bloqueio no Windows, pois é mais facilmente realizado no Linux, e gostaria que o fechamento do programa acionasse o script original para continuar ou retornasse o controle ao prompt de comando.
Responder1
Você poderia usar qualquer umstart
comando(observe a ordem dos /B /WAIT
interruptores)
start "" /B /WAIT notepad.exe "somefile"
ou simplesmente
notepad.exe "somefile"
Conforme link acima:
GUI
Quando você executa um aplicativo de interface gráfica com o usuário ( ) de 32 bits ,cmd
não espera que o aplicativo seja encerrado antes de retornar ao prompt de comando.Este comportamento não ocorre se você executar o aplicativo a partir de um script de comando.
Editarno que diz respeito ao comentário de Karan:Por que /B é necessário?
/B
inicia um aplicativo sem abrir uma nova janela do prompt de comando.
- Para dizer a verdade: se você dirige umaplicativo de interface gráfica do usuárioentãonãouma nova janela do prompt de comando é aberta mesmo que a
/B
opção seja omitida. - Por outro lado, se você executar umferramenta de linha de comando, omitir a
/B
opção faz com que a ferramenta seja executada em uma nova janela do prompt de comando quefechará imediatamentedepois que chegar ao fim etoda a sua saída é perdida.
Portanto, eu uso as /B /WAIT
opções juntas como princípio geral: mantenha o mesmo comportamento independentemente da disposição do programa iniciado e evite pensar nisso...
Suplementona ordem dos /B /WAIT
interruptorescom exemplos e mais links do StackOverflow: start /WAIT /B
não funciona (o /wait
argumento é ignorado) enquanto start /B /WAIT
funciona...
Responder2
notepad.exe | echo > NUL
O que isso faz é abrir notepad.exe e toda a sua saída é redirecionada para o comando echo > NUL
. Para redirecionar toda a saída, o programa deve ser finalizado. Portanto, temos que esperar até que o notepad.exe seja concluído. A saída vai para eco. O Echo não usa a entrada de forma alguma e apenas envia algo para NUL. NUL é um fluxo padrão do Windows que não leva a lugar nenhum.
Responder3
Ao escrever a pergunta, veio-me uma resposta, embora não alcance o resultado exato que pretendia.
Seria abrir qualquer programa que eu quisesse e adicionar o comando "pause" diretamente após aquele na linha abaixo. Isso pausaria a execução do script o suficiente até que o usuário fechasse a nova janela do programa que acabou de aparecer e precisaria perceber que precisa avançar manualmente o script a partir desse ponto. A pausa imprime um prompt explicando o que está acontecendo para potencialmente informar o usuário (" Press any key to continue . . .
").
Este não é um grande problema, a menos que o script seja minimizado por qualquer motivo e o usuário acredite que foi concluído. Também não é ótimo porque não retoma automaticamente a execução do restante do script quando o programa é fechado, que é o efeito que desejo.
Responder4
Aqui está o que funcionou para mim ao iniciar o Firefox:
start "" /B /WAIT "G:\Programs\Mozilla Firefox\firefox.exe" | pause