Eu suspeito que você nomeou seu arquivo de lote ping.bat
, como explicado em aqui seria a fonte do seu problema.
Se esse for realmente o caso, o que está acontecendo é que ping
não está executando o comando ping
, mas ping.bat
com esses argumentos - enviando você para uma recursão infinita que não termina até você quebrar isso.
É por isso que você vê o comando constantemente iterando no Prompt de Comando sem nenhuma saída quando executa o arquivo em lote, porque ele não está realmente executando o comando ping
, mas chamando a si mesmo com esses mesmos argumentos, que chama-se - bem, você entendeu.
A parte > null
é um redirecionamento ; o operador >
significa que a saída do programa será gravada no arquivo a seguir, e não no console. O nome de arquivo especial nul
(não null
) é manipulado pelo Windows internamente; qualquer coisa que você escreva lá é simplesmente descartada. Dessa forma, um script pode executar um programa e apenas verificar se foi bem-sucedido, sem confundir o console. (Da mesma forma, <
redirecionaria a entrada do arquivo.)
1>
é o formato completo de >
e significa "redirecionar o primeiro descritor de arquivo".
-
Em sistemas operacionais do tipo Unix, um descritor de arquivo é um número usado por programas para fazer referência a arquivos que o programa mantém atualmente abertos. Por convenção, os descritores de arquivo 0, 1, 2 correspondem a "entrada padrão" (stdin), "saída padrão" (stdout) e "saída de erro padrão" (stderr); todos os números mais altos correspondem aos arquivos que o próprio programa abriu.
-
O Windows difere disso em muitos aspectos - ele usa "identificadores de arquivo" e não o número 0-1-2-3 ... são apenas algumas pequenas diferenças. No entanto, o interpretador de script
cmd.exe
ainda entende1>
e2>
como redirecionamento de saída regular e saída de erro especificamente, para tornar as coisas um pouco mais fáceis para aqueles que vêm do Linux ou outros tipos de Unix. >
Quanto ao errorlevel
, não é um comando, mas um modo no if
comando. Cada programa, ao sair, retorna um número chamado "status de saída" para o sistema (e para o programa pai); por convenção, 0 significa sucesso e ≥1 significa algum tipo de falha.
-
Em
cmd.exe
, você pode acessar o status de saída do último comando através da variável especial%errorlevel%
, por exemplo:if %errorlevel% NEQ 0 echo The previous command failed!
-
Existe outra sintaxe, proveniente de versões antigas do Windows e do MS-DOS que não possuem a variável especial; ele verifica se o status de saída é igual a ou maior que um determinado número:
if errorlevel 1 echo The previous command failed!