Как сохранить HTTP-код и содержимое ответа в разные файлы с помощью curl в CMD

Если вы работаете с curl в командной строке Windows и хотите сохранить HTTP-код ответа сервера в один файл, а содержимое — в другой, может возникнуть неочевидная проблема. Например, при запуске команды через .cmd-файл вместо ожидаемого результата появляется лишняя цифра «1» перед знаком перенаправления. Разберёмся, почему это происходит и как добиться корректной работы.

Понимание потоков вывода и перенаправления в CMD

В командной строке Windows существуют стандартные потоки данных:

  1. STDOUT (стандартный вывод) — сюда попадают обычные результаты работы программы (например, текст ответа сервера). Обозначается цифрой 1.
  2. STDERR (поток ошибок) — сюда записываются сообщения об ошибках. Обозначается цифрой 2.

По умолчанию оператор > (например, > file.txt) перенаправляет только STDOUT. Если в вашей команде этот оператор используется без указания цифры, система автоматически подставляет 1>, что иногда отображается в логах или выводе. Это нормальное поведение, но оно может сбить с толку, если вы не знакомы с особенностями CMD.

Обратите внимание:

  • 1> file.txt — сохраняет стандартный вывод;
  • 2> errors.txt — записывает ошибки в отдельный файл;
  • 2>&1 — объединяет оба потока в один (и вывод, и ошибки попадут в один файл).

Особенности работы с .cmd-файлами: экранирование символов

Главная проблема в исходном примере связана с символом % в команде curl. В batch-скриптах этот символ имеет специальное значение (например, используется для переменных вроде %PATH%). Чтобы передать его как обычный символ, нужно заменить одиночный % на двойной %%.

Исходная строка:

"curl.exe" -H "Content-Type: application/xml" -X POST --data @"post_content.tmp" -w "%{http_code}n" -o "response_content.tmp" https://myurl.com > "http_code.tmp"

При запуске через .cmd-файл %{http_code} превращается в {http_code}, так как одиночный % игнорируется. Чтобы это исправить, замените % на %%:

-w "%%{http_code}n"

Это гарантирует, что curl получит правильный аргумент -w "%{http_code}n".

Настройка curl в .cmd-файле

1. Создайте или отредактируйте .cmd-файл

Откройте Блокнот или любой текстовый редактор. Вставьте следующую команду, учитывая экранирование:

"curl.exe" -H "Content-Type: application/xml" -X POST --data @"post_content.tmp" -w "%%{http_code}n" -o "response_content.tmp" https://myurl.com 1> "http_code.tmp"

Здесь:

  • -w "%%{http_code}n" — запись HTTP-кода в стандартный вывод (STDOUT);
  • -o "response_content.tmp" — сохранение тела ответа в файл;
  • 1> "http_code.tmp" — явное указание перенаправить STDOUT в файл с кодом.

2. Сохраните файл с расширением .cmd

Убедитесь, что файл сохранён в кодировке ANSI или UTF-8 без BOM (иначе могут возникнуть ошибки из-за неверного формата).

3. Проверьте результат

Запустите .cmd-файл двойным кликом. В папке должны появиться два файла:

  • response_content.tmp — содержимое ответа сервера;
  • http_code.tmp — числовой HTTP-статус (например, 200 или 404).

4. Дополнительные рекомендации

Если нужно сохранить и ошибки curl (например, при проблемах с подключением), добавьте 2> "errors.txt" в конец команды.

Для объединения всех потоков используйте 2>&1:

... 1> "combined_output.txt" 2>&1

Если файлы не создаются, проверьте права на запись в папку и отсутствие опечаток в путях.

Распространённые ошибки и их решение

  • Пути с пробелами
    Если путь к curl.exe или другим файлам содержит пробелы, заключайте его в двойные кавычки:
    "C:Program Filescurlcurl.exe" ...
  • Неправильное экранирование
    Помимо %, осторожнее с другими спецсимволами, такими как & или |. В сложных случаях используйте ^ для экранирования (например, ^&).
  • Кодировка временных файлов
    Если response_content.tmp отображается кракозябрами, добавьте в curl параметр --output - или укажите кодировку в заголовке (например, -H "Accept-Charset: utf-8").

Теперь вы знаете, как настроить перенаправление выводов curl в batch-файле. Если что-то пошло не так, проверьте экранирование символов и пути к файлам — чаще всего проблема кроется именно в этом. Буду рад, если вы поделитесь своим опытом в комментариях!

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное