Ao escrever um arquivo em lotes para automatizar algo em uma caixa do Windows, precisei interromper sua execução por alguns segundos (geralmente em um loop de teste / espera, aguardando o início do processo). Naquela época, a melhor solução que eu encontrava usa o ping (não é brincadeira) para obter o efeito desejado. Encontrei uma descrição melhor aqui , que descreve um "wait.bat" exigível, implementado da seguinte maneira:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Você pode incluir chamadas para wait.bat em seu próprio arquivo em lotes, passando o número de segundos para dormir.
Aparentemente, o Windows 2003 Resource Kit fornece um comando de suspensão semelhante ao Unix (finalmente!). Enquanto isso, para aqueles que ainda usam o Windows XP, Windows 2000 ou (infelizmente) o Windows NT , existe uma maneira melhor?
Modifiquei o sleep.py
script na resposta aceita , para que o padrão seja um segundo se nenhum argumento for passado na linha de comando:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
fonte
ping
comando ou faça o download do kit de recursos do Windows, que inclui umsleep
comando. Mais detalhes aqui: Arquivo em lote SLEEP CommandRespostas:
ATUALIZAR
O
timeout
comando, disponível no Windows Vista e em diante, deve ser o comando usado, conforme descrito em outra resposta a esta pergunta. O que se segue aqui é um antigo resposta .Resposta antiga
Se você tem o Python instalado ou não se importa de instalá-lo (ele também tem outros usos :), basta criar o seguinte script sleep.py e adicioná-lo em algum lugar no seu PATH:
Isso permitirá pausas de segundos (por exemplo, 1,5 segundos, 0,1 etc.), caso você precise. Se você quiser chamá-lo como
sleep
preferirsleep.py
, pode adicionar a.PY
extensão à sua variável de ambiente PATHEXT. No Windows XP, você pode editá-lo em:Meu computador → Propriedades (menu) → Avançado (guia) → Variáveis de ambiente (botão) → Variáveis do sistema (quadro)
fonte
O
timeout
comando está disponível no Windows Vista em diante:Nota: Ele não funciona com o redirecionamento de entrada - exemplo trivial:
fonte
timeout
, adicionado por @Cristian Ciupitu, está parcialmente errado - o Windows XP não possui esse comando.Usando o
ping
método descrito é como o faço quando não posso (ou não quero) adicionar mais executáveis ou instalar qualquer outro software.Você deve executar ping em algo que não existe, e usar o
-w
sinalizador para que ele falhe após esse período de tempo, não em executar ping em algo que esteja lá (como localhost)-n
. Isso permite que você lide com o tempo em menos de um segundo, e acho que é um pouco mais preciso.por exemplo
(teste que 1.1.1.1 não foi realizado)
fonte
PING: transmit failed. General failure.
1.1.1.1
é obtido pelo CloudFlare, portanto, isso não espera 15s, mas cerca de alguns ms.SLEEP.exe
está incluído na maioria dos kits de recursos, por exemplo, o Windows Server 2003 Resource Kit, que também pode ser instalado no Windows XP.fonte
Discordo das respostas que encontrei aqui.
Eu uso o seguinte método inteiramente baseado nos recursos do Windows XP para atrasar um arquivo em lotes:
DELAY.BAT:
Você também pode inserir o dia no cálculo para que o método também funcione quando o intervalo de atraso passar à meia-noite.
fonte
TIME
comando.%TIME%
usa uma vírgula para separar os centisegundos, em vez de um ponto! Basta adicionar uma vírgula noDELIMS=:.,"
...Eu enfrentei um problema semelhante, mas acabei de ligar um aplicativo de console C ++ muito curto para fazer a mesma coisa. Basta executar o MySleep.exe 1000 - talvez mais fácil do que baixar / instalar todo o kit de recursos.
fonte
Na falha do servidor, uma pergunta semelhante foi feita e a solução foi:
fonte
CHOICE
versões que eu conheço, se alguém pressiona um botão enquanto espera, o que pessoas impacientes às vezes fazem, então a opção registra uma entrada, emite um sinal sonoro ao sistema por uma entrada incorreta e interrompe o temporizador, o que significa que ele travará lá, a menos que eles pressionem N ou Y. E se eles pressionarem um desses dois, então a escolha será encerrada em vez de esperar pelo 5. Além disso, essa opção está usando uma sintaxe do Vista realmente estranha. Todos os comandos de escolha normal seriam usadosCHOICE /T:Y,5 > NUL
para isso. Não há/D
sinalizador nas versões antigas./C:YN
ou apenas/C:Y
, isso não funcionará quando alguém tiver, digamos, um comando de escolha sueco que provavelmente fará um [J, N] por padrão. Portanto, isso está atolado em todos os tipos de problemas.Você pode usar a camada WSH cscript do Windows e esse arquivo JavaScript wait.js :
fonte
Dependendo das suas necessidades de compatibilidade, use
ping
:por exemplo, para esperar 5 segundos, use
ou no Windows 7 ou posterior, use
timeout
:fonte
-w
está em milissegundos,-n
é apenas o número de vezes que o ping é efetuado e o tempo padrão entre pings é um segundo.Você pode usar o ping:
Esperará 10 segundos.
O motivo pelo qual você deve usar o 11 é porque o primeiro ping sai imediatamente, não depois de um segundo. O número deve sempre ser um a mais que o número de segundos que você deseja esperar.
Lembre-se de que o objetivo
-w
não é esperar um segundo. É para garantir que você não espere mais de um segundo, caso haja problemas de rede.ping
por si só enviará um pacote ICMP por segundo. Provavelmente não é necessário para o host local, mas os velhos hábitos são difíceis.fonte
-w
o tempo limite (embora eu admita que alguns possam inferir que devido à minha falta de clareza), ele é realmente usado para limitar o tempo do ciclo em que existem problemas de rede que causariam cada ciclo mais do que o alocado segundo. Adicionei um parágrafo ao final para esclarecer isso.Existe uma maneira melhor de dormir usando o ping. Você deseja executar ping em um endereço que não existe, para poder especificar um tempo limite com precisão de milissegundos. Felizmente, esse endereço é definido em um padrão (RFC 3330), e é
192.0.2.x
. Isso não é inventado, é realmente um endereço com o único objetivo de não existir (pode não estar claro, mas se aplica mesmo em redes locais):Para dormir por 123 milissegundos, use
ping 192.0.2.1 -n 1 -w 123 >nul
fonte
-n
parâmetro.ping 192.0.2.1
este PC com Windows e é possível ver que a pilha TCP / IP do Windows responde às solicitações de eco. Quantas pessoas sabem que 192.0.2.0/24 não deve ser usado para um endereço IPv4 estático?127.255.255.255
, devido ao facto de ser um endereço de broadcast loopback no Windows que já foi atribuído a por padrão (Você pode confirmar isso executandoroute print
em cmd e olhando através da tabela de rotas IPv4 impressa).Se você possui o PowerShell em seu sistema, basta executar este comando:
Edit: da minha resposta em um tópico semelhante , as pessoas levantaram um problema em que a quantidade de tempo que o PowerShell leva para iniciar é significativa em comparação com o tempo que você está tentando esperar. Se a precisão do tempo de espera for importante (isto é, um atraso extra de um ou dois segundos não é aceitável), você pode usar esta abordagem:
Isso leva o tempo em que o comando windows foi emitido e o script do PowerShell dorme até 5 segundos após esse horário. Portanto, desde que o PowerShell leve menos tempo para iniciar do que a duração do sono, essa abordagem funcionará (são cerca de 600ms na minha máquina).
fonte
Por exemplo, para fazer com que o script execute uma espera ininterrupta de 2 segundos:
O que significa que o script aguardará 2 segundos antes de continuar.
Por padrão, um pressionamento de tecla interrompe o tempo limite; portanto, use a
/nobreak
opção se você não quiser que o usuário possa interromper (cancelar) a espera. Além disso, o tempo limite fornecerá notificações por segundo para notificar o usuário quanto tempo resta a esperar; isso pode ser removido direcionando o comando paraNUL
.edit: como o @martineau aponta nos comentários , o
timeout
comando está disponível apenas no Windows 7 e superior. Além disso, oping
comando usa menos tempo do processador quetimeout
. Ainda acredito em usar sempretimeout
que possível, pois é mais legível que oping
'hack'. Leia mais aqui .fonte
ping
abordagem usa menos tempo do processador.Basta colocar isso no seu arquivo em lotes onde você deseja a espera.
fonte
No bloco de notas, escreva:
Agora salve como wait.bat na pasta C: \ WINDOWS \ System32 e, sempre que desejar, use:
fonte
ping
usar algo não apenas uma vez e usar a-w Timeout
opção de atraso em milissegundos em vez da opção de-n Count
número de tentativas inteiras.-w Timeout
pode ser melhor, mas verifiquei que ele pingava mais uma vez que o tempo digitado.O Resource Kit sempre incluiu isso. Pelo menos desde o Windows 2000.
Além disso, o pacote Cygwin tem um
sleep
plugin para o seu PATH e inclui ocygwin.dll
(ou como é chamado) e o caminho a seguir!fonte
Eu gosto da resposta de Aacini . Eu adicionei a ele para lidar com o dia e também para lidar com centisegundos (
%TIME%
saídasH:MM:SS.CC
):fonte
Eu tenho usado este programa de suspensão c #. Pode ser mais conveniente para você se C # é o seu idioma preferido:
fonte
Ainda mais leve que a solução Python é o linux Perl.
Para dormir por sete segundos, coloque isso no script BAT:
Esta solução fornece apenas uma resolução de um segundo.
Se você precisar de uma resolução mais alta, use o módulo Time :: HiRes do CPAN. Ele fornece
usleep()
qual dorme em microssegundos enanosleep()
qual dorme em nanossegundos (ambas as funções usam apenas argumentos inteiros). Consulte a pergunta Estouro de pilha Como durmo um milissegundo em Perl? para mais detalhes.Eu tenho usado o ActivePerl por muitos anos. É muito fácil de instalar.
fonte
Ou na linha de comando Python, por exemplo, por 6 segundos e meio:
fonte
O uso do ping é bom, desde que você queira "esperar um pouco". Isso porque você depende de outras funções abaixo, como sua rede funcionando e o fato de que não há nada respondendo no 127.0.0.1. ;-) Talvez não seja muito provável que falhe, mas não é impossível ...
Se você quiser ter certeza de que está esperando exatamente o tempo especificado, use o
sleep
funcionalidade (que também tem a vantagem de não usar a energia da CPU ou esperar que a rede esteja pronta).Encontrar um executável já feito para dormir é a maneira mais conveniente. Basta soltá-lo na pasta do Windows ou em qualquer outra parte do caminho padrão e ele estará sempre disponível.
Caso contrário, se você tiver um ambiente de compilação, poderá criar um. A
Sleep
função está disponível emkernel32.dll
, então você só precisa usá-la. :-) Para VB / VBA, declare o seguinte no início de sua fonte para declarar uma função de suspensão:Para C #:
Você encontrará aqui mais sobre esta funcionalidade (disponível desde o Windows 2000) na função Sleep (MSDN).
No padrão C,
sleep()
está incluído na biblioteca padrão e no Visual Studio C da Microsoft, a função é nomeadaSleep()
, se a memória me servir. ;-) Esses dois aceitam o argumento em segundos, não em milissegundos, como as duas declarações anteriores.fonte
A melhor solução que deve funcionar em todas as versões do Windows após o Windows 2000 seria:
fonte
'timeout' is not recognized as an internal or external command, operable program or batch file.
O pathping.exe pode dormir menos de um segundo.
.
fonte
Estou impressionado com este:
http://www.computerhope.com/batch.htm#02
Tecnicamente, você está dizendo ao
choice
comando para aceitar apenas y. O padrão é y, fazê-lo em 5 segundos, não chamar nenhum prompt e despejar tudo o que diz para NUL (como terminal nulo no Linux).fonte
CHOICE
versões que eu conheço, se alguém pressiona uma tecla enquanto aguarda, o que pessoas impacientes fazem às vezes, então a escolha lê uma entrada, emite um sinal sonoro para uma entrada incorreta e interrompe a contagem regressiva, para que ela seja interrompida, a menos que pressione Y. E se eles simplesmente apertarem Y, então a escolha termina aí, em vez de esperar pelo 5. Além disso, essa opção está usando uma sintaxe do Vista realmente estranha. Os comandos de escolha normal são usadosCHOICE /T:Y,5 > NUL
para isso. (Não há sinalizador / D nas versões antigas.) E se você possui o Vista, use-oTIMEOUT
.Você também pode usar um arquivo .vbs para executar tempos limite específicos:
O código abaixo cria o arquivo .vbs. Coloque isso perto do topo do seu código rbatch:
O código abaixo abre o arquivo .vbs e especifica quanto tempo esperar:
No código acima, "1000" é o valor do atraso a ser enviado ao arquivo .vbs em milissegundos, por exemplo, 1000 ms = 1 s. Você pode alterar esta parte para o tempo que desejar.
O código abaixo exclui o arquivo .vbs após o término. Coloque isso no final do seu arquivo em lotes:
E aqui está o código todo, portanto, é fácil copiar:
fonte
No Windows Vista, você possui os comandos TIMEOUT e SLEEP , mas para usá-los no Windows XP ou no Windows Server 2003, você precisará do kit de ferramentas de recursos do Windows Server 2003 .
Aqui você tem uma boa visão geral das alternativas de suspensão (a abordagem ping é a mais popular, pois funcionará em todas as máquinas Windows), mas há (pelo menos) uma não mencionada que (ab) usa o
W32TM
comando (Time Service):Onde você deve substituir o N pelos segundos que deseja pausar. Além disso, ele funcionará em todos os sistemas Windows sem pré-requisitos.
Typeperf também pode ser usado:
Com mshta e javascript (pode ser usado para dormir em menos de um segundo):
Isso deve ser ainda mais preciso (por aguardar menos de um segundo) - executável auto-compilável com base em
.net
:fonte
Existem várias maneiras de realizar um ' sono ' ' em cmd / lote:
Meu favorito:
Isso interromperá o console por 5 segundos, sem nenhuma saída.
Mais usado:
Isso tentará fazer uma conexão
localhost
5 vezes. Como ele está hospedado no seu computador, ele sempre alcançará o host; portanto, a cada segundo, ele tentará o novo a cada segundo. O-n
sinalizador indica quantas vezes o script tentará a conexão. Nesse caso, é 5, portanto, durará 5 segundos.Variantes do último:
Neste script, existem algumas diferenças comparando-o com o último. Isso não tentará ligar
localhost
. Em vez disso, ele tentará se conectar a1.1.1.1
um site muito rápido. A ação durará 5 segundos apenas se você tiver uma conexão ativa com a Internet. Caso contrário, durará aproximadamente 15 para concluir a ação . Eu não recomendo usar este método.É exatamente igual ao exemplo 2 (mais usado). Além disso, você também pode usar:
Em vez disso, usa a
localhost
versão do IPv6 .Existem muitos métodos para executar esta ação. No entanto, prefiro o método 1 para Windows Vista e versões posteriores e o método mais usado (método 2) para versões anteriores do sistema operacional.
fonte
Você pode se interessar colocando a mensagem PAUSE na barra de título:
fonte
Isso foi testado no Windows XP SP3 e Windows 7 e usa CScript. Coloquei alguns guardas seguros para evitar del "" avisos. (
/q
seria perigoso)Espere um segundo:
Aguarde 500 ms e execute as coisas depois de:
sleepOrDelayExecution.bat:
fonte
Como outros sugerem programas de terceiros (Python, Perl, aplicativo personalizado etc.), outra opção é o GNU CoreUtils for Windows, disponível em http://gnuwin32.sourceforge.net/packages/coreutils.htm .
2 opções para implantação:
Um benefício da implantação do CoreUtils é que você também receberá uma série de outros programas úteis para scripts (o lote do Windows deixa muito a desejar).
fonte