1

Это кажется очень простым вопросом (работает под управлением Windows 7). Но я искал ответ и не мог найти что-либо на сайтах Microsoft (XP PING и все остальное PING) или в ряде поисковых запросов Google.

Я изучаю DOS/Batch file. Мой начальный код - ПИНГ на сервере.

Если я ввожу это в командной строке, он работает нормально, и дает мне некоторые результаты

PING -n 1 Server04

Результаты:

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

Если я запускаю это в пакетном файле, он никогда не останавливается, но -n (или /n) должен отправлять PING только один раз, а PAUSE также должен остановиться и держать окно cmd.exe открытым.

PING -n 1 winsvmnsdev04
PAUSE

Результаты:

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

Я посмотрел на группу вопросов и ответов, где многие включают 'errorlevel', чтобы повторить ответ, а некоторые имеют завершающий '> null'. Пытаясь понять, я посмотрел, и ни один из них не указан как атрибут «PING» в библиотеках Microsoft.

Когда я бегу

PING -n 1 winsvmnsdev04 > null
PAUSE

Или беги

PING -n 1 winsvmnsdev04 > null

Я получаю одну строчку

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

Понятия не имею почему. Может кто-нибудь объяснить эти два атрибута PING или указать на официальные документы? /n и -n не ограничиваются одним PING, >null и PAUSE не работают, когда PING работает в режиме ожидания. Ничто из этого не совпадает с тем, что описывается в документации Microsoft.

Примечание: уровень errorlevel не указан в справочнике по командной строке Microsoft

1 ответ1

10

Я подозреваю, что вы назвали свой пакетный файл ping.bat , который, как объяснено здесь, будет источником вашей проблемы.

Если это действительно так, то происходит то, что ping самом деле не запускает команду ping , а ping.bat с этими аргументами - отправляет вас в бесконечную рекурсию, которая не заканчивается, пока вы не прервете ее.

Вот почему вы видите команду, постоянно повторяющуюся в командной строке без вывода, когда вы запускаете пакетный файл, потому что она на самом деле не выполняет команду ping , а вызывает сама себя с теми же аргументами, которые затем вызывают себя, что - ну, вы получаете изображение.


> null часть - это перенаправление ; оператор > означает, что вывод программы будет записан в следующий файл, а не в консоль. Специальное имя файла nul (не null) обрабатывается Windows внутренне; все, что вы там пишете, просто отбрасывается. Таким образом, скрипт может запустить программу и просто проверить, успешно ли она выполнена, не загромождая консоль. (Точно так же < перенаправит ввод из файла.)

1> является полной формой > и означает "перенаправить первый дескриптор файла".

  • В Unix-подобных операционных системах дескриптор файла - это число, используемое программами для ссылки на файлы, которые программа в данный момент хранит открытыми. По соглашению файловые дескрипторы 0, 1, 2 соответствуют "стандартному вводу" (stdin), "стандартному выводу" (stdout) и "стандартному выводу ошибок" (stderr); все более высокие числа соответствуют файлам, которые открыла сама программа.

  • Windows отличается от этого во многих отношениях - она использует "дескрипторы файлов" и не нумерует их 0-1-2-3 ... это всего лишь несколько небольших различий. Однако интерпретатор сценария cmd.exe все еще понимает, что 1> и 2> означают перенаправление регулярного вывода и вывода ошибок, в частности, чтобы немного упростить процесс для Linux или других Unix-подобных приложений.


Что касается уровня errorlevel , то это не команда, а режим в команде if . Каждая программа при выходе возвращает номер, называемый "статусом выхода", в систему (и в родительскую программу); по соглашению, 0 означает успех, а ≥1 означает какой-то сбой.

  • В cmd.exe вы можете получить доступ к состоянию завершения последней команды через специальную переменную %errorlevel% , например:

    if %errorlevel% NEQ 0 echo The previous command failed!
    
  • Существует другой синтаксис, пришедший из старых версий Windows и MS-DOS, которые не имели специальной переменной; он проверяет, равен ли статус выхода указанному числу или превышает его:

    if errorlevel 1 echo The previous command failed!
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .