[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何遍历网页文件夹ID并输出至文本?

https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=? 是某网盘根文件夹里的数据,只需提取 isFolder 和 fileId 参数的值。
进入子文件夹的方式:当 “isFolder” 为 true 时,表示 fileId 值是子文件夹ID。(格式:https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?&fileId=17位fileId
以下是一个大概的框架,请问要怎么写才能遍历根文件夹及多级子文件夹,以获取其文件夹的fileId,并输出至文本?

  1. @echo off
  2. for /f "delims=" %%a in ('powershell "(irm 'https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?&fileId=').count"') do (
  3.     for /f "eol=F delims=| tokens=1-2" %%b in ('powershell "(irm 'https://189.ly93.cc/api.php?c=list&limit=%%a&shareCode=VVFnmuRviQRj&accessCode=?&fileId=').data | %% {'{0}|{1}' -f $_.isfolder,$_.fileid}"') do (
  4.         echo %%c>>test.txt
  5.     )
  6. )
  7. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

搞不懂你为什么要在bat里调用ps?既然有json那直接用js啊?js也有可以get post的com组件可以用啊

TOP

回复 2# jyswjjgdwtdtj


原来用的就是纯bat的方式,要不是for不能支持一行8000多个字符,我根本不想用PS
主要还是完全不会js,一丁点都不会,憋都憋不出一句话。。。
而且我是拿实例学bat的过程中,只是这次刚好遇到的是json罢了。

TOP

回复 3# lonron


    纯bat能干啥?必须调用外部命令啊

attrib.exe
net.exe
arp.exe

等等windows自带的外部命令

还有众多的第三方命令

curl.exe
gwak.exe

那为啥不能调用

powershell.exe
cscript.exe

QQ 20147578

TOP

回复 4# czjt1234


    我觉得吧 与其调用来调用去的 不如直接写ps或者js或者vbs

TOP

回复 4# czjt1234

没毛病,我并不反感用第三方命令,只是相对于js,PS我还能看得懂自己能修改,而且在我看来PS实现一些东西可以更简单点。只是原本我用的for取截取json数据有点笨办法的意思。。。不过也是弃之不用了

TOP

本帖最后由 jyswjjgdwtdtj 于 2023-5-4 20:12 编辑

回复 3# lonron


    盲写一段(没测试过)
  1. var http=new ActiveXObject("msxml2.xmlhttp");
  2. http.Open("GET","https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?",False)
  3. http.Send()
  4. var result=eval(http.ResponseText)
复制代码
大小写不熟悉 可能大小写上会出错
然后就
  1. WScript.Echo(result.data[0].fileId)
复制代码
输出72373164319523966

#-_-#莫名不能用……估计是json里有啥不兼容jscript的地方吧
还是去用ps好

TOP

回复 7# jyswjjgdwtdtj


    用PS是没问题的,主要是我现在不知道用bat该怎么写才能达到遍历所有子文件夹ID,然后给curl批量下载。获取这个网页数据的原理我都摸索出来了,我要的数据我都有,但就是不会写循环,好痛苦!!!

TOP

回复 8# lonron


    那你为啥要用bat呢?直接用ps不成?( ̄_ ̄|||)

TOP

  1. set dom=createobject("htmlfile")
  2. set http=createobject("msxml2.xmlhttp")
  3. http.open "GET","https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?",false
  4. http.send()
  5. dom.parentwindow.execscript("var j="&http.responsetext)
  6. set json=dom.parentwindow.j
复制代码
这个json就是js对象 你可以使用它来干啥啥

TOP

本帖最后由 buyiyang 于 2023-5-4 22:19 编辑

给一个循环的例子
  1. @echo off
  2. if "%~1"=="" (
  3.     set "url=https://189.ly93.cc/api.php?c=list&limit=10&shareCode=3UBZ3ei6NJJz&accessCode=?") else (
  4.     set "url=%~1"
  5. )
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%a in ('powershell "(irm '%url%').path | %% {'{0}' -f $_.fileName}"') do (
  8.     timeout /t 1 /nobreak
  9.     for /f "eol=0 delims=| tokens=1-3" %%b in ('powershell "(irm '%url%').data | %% {'{0}|{1}|{2}|{3}' -f $_.fileSize,$_.fileId,$_.fileName,$_.isFolder}"') do (
  10.         if "%%e"=="true" (
  11.         set "url=%url%&fileId=%%c"
  12.         call "%~0" "!url!"
  13.         ) else (
  14.         curl
  15.         )
  16.     timeout /t 1 /nobreak
  17.     )
  18. )
  19. pause
复制代码

TOP

当“isFolder”参数为true时表示子文件夹ID、为false时表示文件ID。
我是没理解两种情况你要怎么分开处理?
分别怎么处理要给出来

TOP

回复 12# pd1


    他们的实际应用关系就是红色加粗部分的:

父(子)文件夹ID都是以第一个网页最后面加&fileId=xxxx呈现的。(可以理解为类似本地情况下,进入某个文件夹。)
文件ID就是在要下载的时候要用,在curl后面的下载地址里面呈现的。

TOP

  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $global:a='https://189.ly93.cc/api.php?c=list&shareCode=3UBZ3ei6NJJz&accessCode=?'
  3. $global:b='https://189.ly93.cc/3UBZ3ei6NJJz/{0}?accessCode=?'
  4. function test($id){
  5.     irm ($global:a+'&fileId='+$id)|%{
  6. $path=($_.path|%{$_.fileName}) -join '\'
  7.         md $path
  8. $_.data|%{
  9.     if($_.isFolder){test($_.fileId)}else{
  10. curl --ssl-no-revoke -Lo ($path+'\'+$_.fileName) ($global:b -f $_.fileId)
  11.     }
  12. }
  13.     }
  14. }
  15. test
复制代码

TOP

  1. #@&cls&powershell "type '%~0'|out-string|iex"&pause&exit
  2. $global:a='https://189.ly93.cc/api.php?c=list&shareCode=VVFnmuRviQRj&accessCode=?'
  3. $global:b='https://189.ly93.cc/VVFnmuRviQRj/{0}?accessCode=?'
  4. function test($id){
  5.     irm ($global:a+'&fileId='+$id)|%{
  6. $_.data|%{
  7.     if($_.isFolder){$_.fileId;test($_.fileId)}
  8. }
  9.     }
  10. }
  11. test|sc test.txt
复制代码
1

评分人数

TOP

返回列表