batch-file - 批量循环变量并发送 API 请求
问题描述
我在使用 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 完全陌生,即使我觉得我越来越接近了,但我现在仍停留在最后一点。知道如何解决这个问题吗?谢谢,
解决方案
您的代码中有一些错误,这些错误已在以下代码中修复。
但是由于您没有指定返回的确切格式,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
直接在循环中使用。后来你
cuPath
在 FOR 循环中使用了,没有展开它,也没有cURL
用引号括住输出文件。当通过 读取文件内容时
FOR /F
,如果 的路径用引号括起来,那么您必须使用该UseBackq
选项来更改IN
子句中引号的解释,FOR
以不将其解释为文字字符串。根据您所做的,根本不需要延迟扩展。
但作为旁注,您在使用延迟扩展时必须更加小心。启用延迟扩展后,您可能在代码中使用的任何文字字符串(包括文件和 url 路径)如果包含该
!
字符,都将被损坏。所以最好在延迟扩展关闭时设置所需的变量和字符串,然后
!var!
在启用延迟扩展时通过语法访问它们。
推荐阅读
- azure-devops - 在“未找到要发布的结果”上发布测试结果步骤失败,但存在 JUnit 文件
- swift - CollectionView 未显示在 Swift 的视图中
- reactjs - 当我使用 Hooks 在 React 中单击按钮时如何更改按钮背景颜色
- flutter - 在我的场景中,哪个包更好 flutter_secure_storage 或 getx?
- javascript - 如何反应加载主页然后路由到其他人
- android - 方向更改后,在线程内写入 UI 不起作用
- laravel - Laravel DOMPdf -> 无法从获取响应中创建工作 Blob
- javascript - 使用前端和 python 将视频上传到 Youtube 的自动化
- bash - ash:你需要指定要杀死的人
- woocommerce - 通过 WooCommerce Rest Api 创建的订单添加额外税