批量循环遍历变量并发送 API 请求
Batch to loop through variables and send API request
我在使用 Windows 中的命令行从 API 中获取一些数据时遇到了问题。基本上,这就是我想要做的:
1- 从 API(使用 curl 和 jq)获取客户端列表,
2- 将此列表保存在.txt 中(我想将其保存在变量中但没有管理),
3- 遍历 .txt 中的客户端列表并发送新的 API 请求下载特定于此客户端的 csv
前 2 个步骤工作正常,但我卡在最后一点循环遍历客户端。
这是我的代码:
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 returns: C:\Users\My
看起来路径中的 space 是这个循环的问题,但它没有导致保存文件的任何问题,所以我有点迷路
- 我正在使用 !subID! 因为我知道这是每次调整变量的唯一方法但是在查看 !rURL![=33 的输出时=] 变量,而 %tok% 作为 XXXXX 成功传递,!subID! 保持为 !subID!
- 当然,我终于得到了一个 curl:(6) Could not resolve host: rURL
我对 APIs、批处理或 JSON 完全陌生,尽管我觉得我越来越接近了,但我现在仍然停留在最后一点。知道如何解决这个问题吗?
谢谢,
您的代码中存在一些错误,已在以下代码中修复。
但是由于您没有指定 jq ".clients[].id"
返回的确切格式,我只能猜测它 returns 是一个单个标记,字符之间没有任何空格,但它可能有前导或尾随空格。
因此,如果不是这种情况,您必须相应地设置 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
选项来更改引号的解释FOR
的 IN
子句不将其解释为文字字符串。
根据您的情况,完全不需要延迟扩展。
但是作为旁注,您在使用延迟扩展时必须更加小心。启用延迟扩展后,您可能在代码中使用的任何文字字符串(包括文件和 url 路径)如果包含 !
字符,都将被损坏。
所以最好在延迟扩展关闭时设置所需的变量和字符串,然后在延迟扩展启用时通过 !var!
语法访问它们。
我在使用 Windows 中的命令行从 API 中获取一些数据时遇到了问题。基本上,这就是我想要做的:
1- 从 API(使用 curl 和 jq)获取客户端列表,
2- 将此列表保存在.txt 中(我想将其保存在变量中但没有管理),
3- 遍历 .txt 中的客户端列表并发送新的 API 请求下载特定于此客户端的 csv
前 2 个步骤工作正常,但我卡在最后一点循环遍历客户端。
这是我的代码:
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 returns: C:\Users\My
看起来路径中的 space 是这个循环的问题,但它没有导致保存文件的任何问题,所以我有点迷路
- 我正在使用 !subID! 因为我知道这是每次调整变量的唯一方法但是在查看 !rURL![=33 的输出时=] 变量,而 %tok% 作为 XXXXX 成功传递,!subID! 保持为 !subID!
- 当然,我终于得到了一个 curl:(6) Could not resolve host: rURL
我对 APIs、批处理或 JSON 完全陌生,尽管我觉得我越来越接近了,但我现在仍然停留在最后一点。知道如何解决这个问题吗? 谢谢,
您的代码中存在一些错误,已在以下代码中修复。
但是由于您没有指定 jq ".clients[].id"
返回的确切格式,我只能猜测它 returns 是一个单个标记,字符之间没有任何空格,但它可能有前导或尾随空格。
因此,如果不是这种情况,您必须相应地设置 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
选项来更改引号的解释FOR
的IN
子句不将其解释为文字字符串。根据您的情况,完全不需要延迟扩展。
但是作为旁注,您在使用延迟扩展时必须更加小心。启用延迟扩展后,您可能在代码中使用的任何文字字符串(包括文件和 url 路径)如果包含
!
字符,都将被损坏。所以最好在延迟扩展关闭时设置所需的变量和字符串,然后在延迟扩展启用时通过
!var!
语法访问它们。