Arquivo em lote, PING, errorlevel e null O que eles fazem?

1

Esta parece ser uma pergunta muito fácil (executando o Windows 7). Mas eu procurei a resposta e não consegui encontrar nada nos sites da Microsoft ( XP PING & Todo o resto PING ou de um monte de pesquisas do Google.

Estou aprendendo o arquivo DOS / Batch. Meu código de início é para PING um servidor.

Se eu digitar isso no prompt de comando, ele funcionará bem e me dará alguns resultados

PING -n 1 Server04

Resultados:

Pinging Server04.aaaa.xxxx.net [x.x.x.x] with 32 bytes of data:     
Reply from x.x.x.x: bytes=32 time=1ms TTL=125

Se eu executar isso em um arquivo de lote, ele nunca será interrompido, mas o -n (ou / n) deverá enviar o PING somente uma vez, e a PAUSE também deverá parar e manter a janela cmd.exe aberta.

PING -n 1 winsvmnsdev04
PAUSE

Resultados:

C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
Continues until I use Ctrl + C

Eu observei um monte de Q & A, em que muitos incluem 'errorlevel' para ecoar a resposta e alguns que têm um '> nulo'. Na tentativa de entender, eu olhei e nenhum destes são listados como atributos de 'PING' nas bibliotecas da Microsoft.

Quando eu corro

PING -n 1 winsvmnsdev04 > null
PAUSE

Ou execute

PING -n 1 winsvmnsdev04 > null

Eu recebo uma linha

C:\Users\Me\Desktop>PING -n 1 Server04  1>null

Eu não tenho ideia do porquê. Alguém pode explicar esses dois atributos do PING ou apontar para os documentos oficiais? /n e -n não se limitam a um PING, o >null e o PAUSE não funcionam quando o PING está em execução. Nenhuma delas se alinha com o que a Documentação da Microsoft está descrevendo.

Observação: errorlevel não está listado como Referência da linha de comando pela Microsoft

    
por James Jenkins 30.04.2014 / 20:37

1 resposta

10

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 entende 1> e 2> 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!
    
por 30.04.2014 / 20:54