Сверните несколько URL-адресов, используя пакет, и сохраните результат в текстовом файле

Я хочу получить данные с нескольких веб-сайтов, используя curl с пакетным файлом, а затем сохранить результаты curl в текстовый файл.

синтаксис, который я знаю, таков:

curl "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587492&lon=125.952764" >> output.txt
curl "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587493&lon=125.952765" >> output.txt
curl "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587494&lon=125.952766" >> output.txt
curl "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587495&lon=125.952767" >> output.txt
curl "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587496&lon=125.952768" >> output.txt

Я изменил завиток выше на цикл, и он отлично работает. Я установил LF, чтобы следующий результат мог перейти на следующую строку, но это не сработало. Вот мой скрипт:

@echo off
set setlocal EnableDelayedExpansion

set url1 = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587492&lon=125.952764"
set url2 = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587493&lon=125.952765"
set url3 = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587494&lon=125.952766"
set url4 = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587495&lon=125.952767"
set url5 = "https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587496&lon=125.952768"

(set LF=^
%=EMPTY=%
)

echo %url1%
for %%x in (set) do (
 curl %url1%%LF%
 curl %url2%%LF%
 curl %url3%%LF%
 curl %url4%%LF%
 curl %url5%%LF%
)> output.txt

Я хочу, чтобы завиток был сделан вот так gist.github.com/shrop/5da5d831f571d19f0be6e9183b1ebf55

d'natsu 19.12.2020 14:15

Откройте окно командной строки, введите for /?, нажмите клавишу [ENTER] и прочитайте информацию об использовании. Из своих новых знаний вы должны отметить, что вы вообще не должны использовать for /L в опубликованном вами сценарии. Также ни одна из переменных %LF% не требуется. Как насчет того, чтобы вы точно объяснили, в чем заключается задача, потому что нет веской причины устанавливать все эти URL-адреса в такие переменные, а затем ссылаться на каждый из них в цикле, чтобы делать именно то, что делали ваши исходные пять строк!

Compo 19.12.2020 16:18

Кажется, вы угадываете синтаксис; введите for /? и прочитайте справку; вы обнаружите, что вам не нужно /L; также «это не работает» — это не описание неисправности; пожалуйста, прочитайте минимальный воспроизводимый пример

aschipfl 19.12.2020 16:34

Я снова изменил свой сценарий, и он работает. Но они объединяют выходы в один, я хочу, чтобы следующий вывод переместился на следующую строку. Кстати, заранее спасибо за совет и участие.

d'natsu 19.12.2020 16:45

Я добавил «LF», чтобы разбить результат на новую строку, но это не сработало.

d'natsu 19.12.2020 16:46

вы добавили LF как часть параметра к curl. Вместо этого вы хотите echo %LF%: ​​curl %url1% & echo %LF% и т. д.

Stephan 19.12.2020 16:55

ваша петля for %%x in (set) do ... не имеет смысла. См. for /? для правильного использования.

Stephan 19.12.2020 16:56

Сколько мест вы планируете использовать? Все ли они последовательные координаты, как в вашем примере («идти по диагонали через ландшафт»)?

Stephan 19.12.2020 16:59

чтобы повторить перевод строки, вам не нужно %LF%. Просто echo( достаточно.

Stephan 19.12.2020 17:11

я добавил curl %url1% и echo %LF%. Результаты вывода могут быть перемещены на следующую строку. Но вывод говорит, что «эхо отключено» в конце строки. ... ["- 23.509751", "- 19.5", "120.064128", "126.001296"]} ЭХО выключено. ... ["- 5.4138916", "- 1.3024076", "113.9911308", "117.900953"]} ЭХО выключено.

d'natsu 19.12.2020 17:33

Потому что ваш %LF% не работает должным образом. Забудьте о %LF% и используйте только echo(.

Stephan 19.12.2020 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
503
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне кажется очень странным, что вы хотите иметь обычный текстовый файл в качестве вывода, в то время как обрабатываемые вами URL-адреса на самом деле являются объектами JSON. Чтобы правильно сохранить несколько объектов JSON как действительный JSON, вы должны поместить их в массив JSON.
Я бы сказал, что вам лучше использовать такой инструмент, как xidel, чтобы решить эту проблему.

Вы можете вручную ввести 5 URL-адресов, которые вы упомянули:

xidel -se ^"^
  array{^
    json-doc('https://nominatim.openstreetmap.org/reverse?format=jsonv2^&lat=-19.587492^&lon=125.952764'),^
    json-doc('https://nominatim.openstreetmap.org/reverse?format=jsonv2^&lat=-19.587493^&lon=125.952765'),^
    json-doc('https://nominatim.openstreetmap.org/reverse?format=jsonv2^&lat=-19.587494^&lon=125.952766'),^
    json-doc('https://nominatim.openstreetmap.org/reverse?format=jsonv2^&lat=-19.587495^&lon=125.952767'),^
    json-doc('https://nominatim.openstreetmap.org/reverse?format=jsonv2^&lat=-19.587496^&lon=125.952768')^
  }^
"

... но вы также можете создавать их динамически:

xidel -se ^"^
  let $json: = {'format':'jsonv2','lat':-19.587492,'lon':125.952764} return^
  map:merge(^
    ($json,{'lat':$json/lat - 0.000001},{'lon':$json/lon + 0.000001}),^
    {'duplicates':'use-last'}^
  )^
" --printed-json-format=compact
{"format": "jsonv2", "lat": -19.587493, "lon": 125.952765}
xidel -s --xquery ^"^
  let $json: = {'format':'jsonv2','lat':-19.587492,'lon':125.952764}^
  for $x in 0 to 4^
  return^
  map:merge(^
    (^
      $json,^
      {'lat':$json/lat - ($x * 0.000001)},^
      {'lon':$json/lon + ($x * 0.000001)}^
    ),^
    {'duplicates':'use-last'}^
  )^
" --printed-json-format=compact
{"format": "jsonv2", "lat": -19.587492, "lon": 125.952764}
{"format": "jsonv2", "lat": -19.587493, "lon": 125.952765}
{"format": "jsonv2", "lat": -19.587494, "lon": 125.952766}
{"format": "jsonv2", "lat": -19.587495, "lon": 125.952767}
{"format": "jsonv2", "lat": -19.587496, "lon": 125.952768}
xidel -s --xquery ^"^
  let $json: = {'format':'jsonv2','lat':-19.587492,'lon':125.952764}^
  for $x in 0 to 4^
  return^
  request-combine(^
    'https://nominatim.openstreetmap.org/reverse',^
    map:merge(^
      (^
        $json,^
        {'lat':$json/lat - ($x * 0.000001)},^
        {'lon':$json/lon + ($x * 0.000001)}^
      ),^
      {'duplicates':'use-last'}^
    )^
  )/url^
"
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587492&lon=125.952764
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587493&lon=125.952765
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587494&lon=125.952766
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587495&lon=125.952767
https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=-19.587496&lon=125.952768
xidel -s --xquery ^"^
  array{^
    let $json: = {'format':'jsonv2','lat':-19.587492,'lon':125.952764}^
    for $x in 0 to 4^
    return^
    request-combine(^
      'https://nominatim.openstreetmap.org/reverse',^
      map:merge(^
        (^
          $json,^
          {'lat':$json/lat - ($x * 0.000001)},^
          {'lon':$json/lon + ($x * 0.000001)}^
        ),^
        {'duplicates':'use-last'}^
      )^
    )/json-doc(url)^
  }^
"
[
  {
    "place_id": 259803148,
    "licence": "Data c OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright",
    "osm_type": "relation",
    "osm_id": 11690317,
    "lat": "-21.5177325",
    "lon": "123.52595630504817",
    "place_rank": 20,
    "category": "boundary",
    "type": "administrative",
    "importance": 0.25,
    "addresstype": "suburb",
    "name": "Telfer",
    "display_name": "Telfer, Shire Of East Pilbara, Western Australia, Australia",
    "address": {
      "suburb": "Telfer",
      "municipality": "Shire Of East Pilbara",
      "state": "Western Australia",
      "country": "Australia",
      "country_code": "au"
    },
    "boundingbox": ["-23.509751", "-19.5", "120.064128", "126.001296"]
  },
  [...]
]

Или, конечно, уменьшенная версия (без escape-символов):

xidel -s --xquery "array{let $json: = {'format':'jsonv2','lat':-19.587492,'lon':125.952764} for $x in 0 to 4 return request-combine('https://nominatim.openstreetmap.org/reverse',map:merge(($json,{'lat':$json/lat - ($x * 0.000001)},{'lon':$json/lon + ($x * 0.000001)}),{'duplicates':'use-last'}))/json-doc(url)}"

Другие вопросы по теме