批量循环遍历变量并发送API请求

问题描述 投票:0回答:1

我正面临一个问题,即使用Windows中的命令行从API获取一些数据。基本上,这就是我想要做的:

1-从API获取客户端列表(使用curl和jq), 2-将此列表保存在.txt中(我想将其保存在变量中但不管理), 3-循环遍历.txt中的客户端列表,并发送新的API请求以下载特定于此客户端的csv

前两个步骤工作正常,但我坚持在最后一点循环通过客户端。 这是我的代码:

setlocal ENABLEDELAYEDEXPANSION

Set tok=XXXXX
Set hURL="https://api.website.com/v2/clients?token=%tok%"
Set IDPath="C:\Users\My Self\subIDs.txt"
Set cuPath=%~dp0

del %IDPath%

curl -sS %hURL% | jq ".clients[].id" > %idPath%

FOR /F %%i in (%IDPath%) do (
    echo %%i
    Set subID=%%i
    Set rURL="https://api.website.com/v2/data?token=%tok%&subscriptionId=!subID!"
    curl -sS -o cuPath!subID!.csv !rURL!
)   

endlocal
pause

对我来说很奇怪: - echo %% i返回:C:\ Users \ My 看起来路径中的空间是这个循环的问题,但它没有导致任何问题来保存文件,所以我有点迷失 - 我正在使用!subID!据我所知,这是每次查看!rURL输出时调整变量的唯一方法!变量,而%tok%成功传递为XXXXX,!subID!仍然是!subID! - 当然,我终于得到了一个卷曲:(6)无法解决主持人:rURL

我是API,批处理或JSON的新手,即使我觉得我越来越近,我现在仍然坚持最后一点。不知道怎么解决这个问题?谢谢,

batch-file curl cmd windows-console
1个回答
0
投票

您的代码中存在一些错误,这些错误在以下代码中得到修复。

但是由于你没有指定jq ".clients[].id"返回的确切格式,我只能猜测它会返回单个标记,字符之间没有任何空格,但它可能有前导或尾随空格。

因此,如果不是这种情况,则必须相应地设置FOR /F选项。

@echo off    
setlocal DisableDelayedExpansion

Set "tok=XXXXX"
Set "hURL=https://api.website.com/v2/clients?token=%tok%"
Set "rURL=https://api.website.com/v2/data?token=%tok%&subscriptionId="
Set "IDPath=C:\Users\My Self\subIDs.txt"

:: No need to delete %IDPath%, It will be overwrriten by the below redirection
curl -sS "%hURL%" | jq ".clients[].id" > "%IDPath%"

FOR /F "usebackq" %%i in ("%IDPath%") do (
    echo subID=%%i
    curl -sS -o "%~dp0%%i.csv" "%rURL%%%i"
) 

REM del "%IDPath%"

endlocal
pause

一些要点:

  • 你已经在它们的值中分配了嵌入了周围引号的变量,而这在你的特定情况下是有效的。最好的做法是不在变量值中嵌入引号,所以代替Set hURL="https://..."使用Set "hURL=https://...",你可以稍后将变量包围在实际使用时引用:"%hURL%" 考虑一下您想要在没有引号的情况下访问该值的情况,如果您通过set a="value"分配了值,则必须编写其他代码以从值中删除引号。但是通过set "a=value",您可以同时访问引用("%a%")和未引用(%a%)值。
  • 你已经使用了没有引号的Set cuPath=%~dp0,它应该是Set "cuPath=%~dp0"但它也不需要,你可以直接在循环中使用%~dp0。 后来你在FOR循环中使用了cuPath而没有扩展它,也没有用引号括起cURL输出文件。
  • 当通过FOR /F读取文件内容时,如果其中的路径用引号括起来,则必须使用UseBackq选项更改INFOR子句中引号的解释,而不将其解释为文字字符串。
  • 根据您的工作情况,根本不需要延迟扩展。 但是请注意,在使用延迟扩展时,您必须更加小心。启用延迟扩展时,如果代码中包含!字符,则代码中可能使用的任何文字字符串(包括文件和URL路径)都将被破坏。 因此,在延迟扩展关闭时更好地设置所需的变量和字符串,然后在启用延迟扩展时通过!var!语法访问它们。
© www.soinside.com 2019 - 2024. All rights reserved.