Meu problema é que, no Windows, há janelas da linha de comando que fecham imediatamente após a execução. Para resolver isso, quero que o comportamento padrão seja que a janela seja mantida aberta. Normalmente, esse comportamento pode ser evitado com três métodos que me vêm à mente:
- Colocar uma
pause
linha após programas em lote para solicitar ao usuário que pressione uma tecla antes de sair - Executando esses arquivos em lotes ou outras ferramentas de manipulação de linha de comando (até mesmo a inicialização, a reinicialização do serviço etc. com
net start xy
ou algo semelhante) emcmd.exe
(Iniciar - Executar - cmd.exe) - Executando estes programas com o
cmd /k
seguinte:cmd /k myprogram.bat
Mas existem outros casos em que o usuário:
- Executa o programa pela primeira vez e não sabe que o programa fornecido será executado no Prompt de Comando (Windows Command Processor), por exemplo, ao executar um atalho no menu Iniciar (ou em outro lugar), OU
- Acha um pouco desconfortável executar o cmd.exe o tempo todo e não tem tempo / oportunidade para reescrever o código desses comandos em todos os lugares para colocar uma pausa após eles ou evitar sair explicitamente.
Eu li um artigo sobre como alterar o comportamento padrão cmd.exe
ao abri-lo explicitamente, criando uma entrada de AutoRun e manipulando seu conteúdo nesses locais:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun
(Os itens de AutoRun são _String values_
...)
Eu coloquei cmd /d /k
como um valor para tentar, mas isso não mudou o comportamento dos itens mencionados acima ... Ele apenas mudou o comportamento da janela da linha de comando ao abri-la explicitamente (Start-Run- cmd.exe).
Então, como isso funciona? Você pode me dar alguma idéia para resolver este problema?
fonte
stdout
constantemente, que nunca foram visíveis por um bom motivo.Respostas:
Eu tenho uma solução que só pode ser aplicada em
.cmd
e.bat
arquivos:Abra
regedit
e vá para cada um dos seguintes:Agora altere o "Valor da chave padrão" para
cmd.exe /k "%1" %*
. Agora, toda janela de script em lote permanecerá aberta após sua execução.Observe que isso é como usar
cmd.exe /c cmd.exe /k program.bat
, o que significa que outra instância do CMD será iniciada na pai. Não consegui encontrar como substituir o primeiro/c
argumento.Você também pode fazer isso com
[exefile]
, mas agora ele mostrará uma caixa de console vazia se o executável tiver uma GUI.fonte
*
. Por favor, tenha mais cuidado ao editar!Quote Microsoft :
Em outras palavras, a janela do console do Win32 sempre será fechada quando o último programa em execução dentro dela sair e você não poderá alterar isso.
(Para programas de MS-DOS de 16 bits, o Windows oferece a opção "Fechar na saída" na caixa de diálogo de propriedades, mas isso não é uma exceção ao comportamento acima: é o processo NTVDM que mantém a janela aberta. Além disso, essa opção é novamente por programa.)
fonte
How can I do X
, nãoIn your opinion, should I do X
. Essa resposta é inútil, implica que X é impossível, quando soluções parciais já foram apresentadas em outro lugar. (-1)Basta abrir um prompt de comando no local do seu arquivo em lotes e digitar manualmente o nome do arquivo em lotes para executá-lo nessa janela.
1. Navegue até a pasta em que seu executável reside
2.Shift-Clique com o botão direito do mouse e selecione "Janela de comando daqui"
3. digite o nome do executável e pressione enter
4. O processo deve ser executado, mas a janela deve permanecer aberta
fonte
cmd.exe /k
lhe dará problemas com algum lote. Se o loteexit 1
(sem/B
) seu console será fechado. Um truque é usar:Para usar isso por padrão para todos os arquivos em lotes, defina
HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)
eHKEY_CLASSES_ROOT\batfile\shell\open\command\(default)
como"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*
.fonte
"%*"
passa a lista completa de parâmetros, então isso não passaria o primeiro parâmetro duas vezes, uma vez"%1"
e novamente como o primeiro parâmetro de"%*"
?%1 %2 %3 ..
e da%*
qual não me lembro agora, mas os%1 %2 %3
trabalhos em alguns casos onde%*
falham.Acabei de encontrar uma solução idiota depois de ler
grawity
a resposta.Meu caso de uso foi configurar um ambiente de console no trabalho, onde todas as soluções mais razoáveis foram bloqueadas. Tudo que eu preciso é definir PATH e configurar alguns aliases de doskey e ser despejado no shell.
Minha solução (apenas testada no Win7) como adicionar
cmd
como a última linha no arquivo em lotes. Isso executa um prompt de comando aninhado que herda o ambiente de seu pai. Esse shell filho mantém o processo em lote aberto até você SAIR, quando o lote não possui processos filhos e também sai.fonte
Em vez de usar PAUSE (prefiro CHOICE ou TIMEOUT a usar PAUSE quando necessário), você pode usar a solução aqui: 886848 / como fazer-janelas-arquivo-em lote-pausar-quando-clicar duas vezes .
Dessa forma, se você clicar em um arquivo em lotes ou em um link (atalho) no Windows Explorer, poderá fazer uma pausa no programa de arquivos em lotes antes de sair para poder visualizar a saída do programa e quaisquer mensagens de erro.
Usando CHOICE, você pode programar a capacidade de o usuário selecionar uma variedade de ações a serem executadas, e usar TIMEOUT pode deixar a janela fechar após um atraso de tempo (sem supervisão). Se você executar o arquivo em lotes de dentro de uma janela do prompt de comando, essas pausas podem ser irritantes.
A solução vinculada permitirá que você decida se deseja pular as pausas se o arquivo em lotes foi executado em uma janela do prompt de comando.
Você pode ler mais no link fornecido, mas o básico é que ele usa a variável de ambiente:
para determinar se o arquivo em lotes foi executado em uma janela de comando ou não.
Então, você o usa assim:
No ponto em que o arquivo em lotes será encerrado, você adiciona um código como este:
fonte
A melhor maneira que encontrei para contornar isso é chamar seus arquivos em lote de outro arquivo em lote usando start.
portanto, se você normalmente executa um arquivo chamado go.bat, cria um segundo arquivo em lote chamado go2.bat
o conteúdo do go2.bat seria apenas
a primeira janela fecha imediatamente, mas a que está executando o seu go.bat permanece aberta
fonte
Isso funciona para a versão 5.00 do Editor do Registro do Windows.
Salve os cmds acima em um arquivo chamado algo como
cmdbatfile-open.reg
e execute-o!fonte
Suponha que você tenha dois arquivos em lote que deseja iniciar em sua própria instância e mantenha aberto se o executável sair. Vamos chamar esses dois lotes
A.bat
eB.bat
.Agora, para simplificar, você pode ter um arquivo em lotes para iniciar os dois, vamos chamar assim
launch_both.bat
com o conteúdo:Pode não funcionar como esperado se você chamar
exit
um dos dois arquivos em lote. Isso precisará ser testado.fonte
Para usuários que usam o Windows 10, observe que nenhuma das respostas acima atualmente funciona para o Windows 10.
No Windows 10, se você tiver acesso ao script, precisará adicionar o seguinte código no final:
Esse código aguardará uma entrada antes de fechar.
fonte
Em resposta ao PSIXO rebaixado - "Esta resposta já foi abordada na pergunta. - Ro Yo Mi 20 de janeiro de 16 às 5:06" - NÃO, NÃO foi. As respostas anteriores foram: "pausa", que NÃO funcionou. A resposta do PSIXO foi: "& pause", que funciona. Analise com mais cuidado antes de fazer o downgrade. Eu executei isso em um prompt IDLE e funcionou:
Por outro lado:
NÃO funcionou (o prompt do cmd passou e, de fato, retornou um erro (1)). Agradeço ao PSIXO pela resposta que eu precisava. Henry.
fonte