我正面临一个问题,即使用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
。
后来你在FOR循环中使用了cuPath
而没有扩展它,也没有用引号括起cURL
输出文件。FOR /F
读取文件内容时,如果其中的路径用引号括起来,则必须使用UseBackq
选项更改IN
的FOR
子句中引号的解释,而不将其解释为文字字符串。!
字符,则代码中可能使用的任何文字字符串(包括文件和URL路径)都将被破坏。
因此,在延迟扩展关闭时更好地设置所需的变量和字符串,然后在启用延迟扩展时通过!var!
语法访问它们。