Вопрос или проблема
Если у меня есть определенная папка с несколькими .txt файлами, каждый из которых содержит одну команду curl в одной строке, я хочу просто указать на папку, после чего все эти команды запускаются разом, предпочтительно в порядке возрастания даты изменения их файлов и желательно, чтобы вывод каждой команды сохранялся в файл (только один файл для всех, с разделением формата между ними).
Я попробовал решение с .bat следующим образом, но файл (или команда) размером 8 кб не запускается корректно, несмотря на то, что я просто открыл .txt файл, в котором находится команда, и скопировал ее непосредственно в cmd, это работает:
@echo off
setlocal enabledelayedexpansion
:: Цикл по всем .txt файлам в текущей папке (исключая сам этот пакетный скрипт)
for %%f in (*.txt) do (
set "cmd="
:: Чтение содержимого каждого файла (например, 1.txt, 2.txt и т.д.)
for /f "delims=" %%a in (%%f) do (
set "cmd=!cmd! %%a"
)
:: Выполнение команды
echo Выполнение: %%f
cmd /c "!cmd!"
)
)
pause
endlocal
Другие команды размером 3-4 кб работают хорошо.
Ответ или решение
Для выполнения нескольких команд curl
, каждая из которых содержится в отдельном текстовом файле в одной папке, мы можем использовать пакетный файл (batch file) на Windows. За основу возьмем вашу начальную реализацию и внесем некоторые корректировки для более стабильной работы, особенно с длинными командами.
Вот пошаговое руководство, которое учитывает ваши требования:
Шаг 1: Создание .bat файла
Откройте текстовый редактор (например, Notepad) и вставьте следующий код:
@echo off
setlocal enabledelayedexpansion
:: Папка, содержащая файлы (вы можете изменить путь на нужный вам)
set "folder=."
:: Файл для сохранения вывода
set "outputFile=output.txt"
:: Очистка файла вывода перед началом
if exist "%outputFile%" del "%outputFile%"
:: Сортировка файлов по времени модификации и выполнение команд
for /f "tokens=*" %%f in ('dir /b /o-d "%folder%\*.txt"') do (
set "cmd="
:: Чтение содержимого файла
for /f "usebackq delims=" %%a in ("%%f") do (
set "cmd=%%a"
)
:: Проверка на наличие команды
if defined cmd (
echo Executing: %%f >> "%outputFile%"
echo !cmd! >> "%outputFile%"
:: Выполнение команды с выводом в файл
cmd /c "!cmd!" >> "%outputFile%" 2>&1
echo ------------------------------------------------------ >> "%outputFile%"
)
)
pause
endlocal
Шаг 2: Объяснение кода
-
Установка параметров:
set "folder=."
— вы можете указать конкретный путь к папке с вашими текстовыми файлами.set "outputFile=output.txt"
— задает имя выходного файла, в который будет записан результат выполнения команд.
-
Очистка файла вывода:
- Если файл назначения уже существует, он будет удален, чтобы избежать накопления старых данных.
-
Цикл выполнения:
for /f "tokens=*" %%f in ('dir /b /o-d "%folder%\*.txt"') do
— считываем файлы из директории, сортируя их по дате изменения (в порядке убывания).
-
Чтение текста из файла:
- Внутренний цикл считывает содержимое файла и сохраняет команду в переменной
cmd
.
- Внутренний цикл считывает содержимое файла и сохраняет команду в переменной
-
Выполнение команды:
- Если команда существует (проверка
if defined cmd
), выполняем ее с помощьюcmd /c "!cmd!"
и перенаправляем вывод в файл.
- Если команда существует (проверка
-
Разделитель:
- После выполнения каждой команды добавляется разделительная линия для удобства чтения.
Шаг 3: Запуск .bat файла
Сохраните файл с расширением .bat
, например, run_curl_commands.bat
, и дважды щелкните на него для выполнения. Все команды, содержащиеся в текстовых файлах, будут выполнены, а результаты будут записаны в указанный файл output.txt
.
Заключение
Использование этого подхода позволяет автоматически запускать команды curl
, сохраняя результаты и упрощая управление выходными данными. Если у вас возникли дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться!