Board logo

标题: [文本处理] 批处理BAT如何使用VBS(或者纯vbs)解析还原JSON [打印本页]

作者: kaze    时间: 2019-3-10 14:30     标题: 批处理BAT如何使用VBS(或者纯vbs)解析还原JSON

本帖最后由 kaze 于 2019-4-29 12:52 编辑

想要弄一个BAT如何使用VBS(或者纯vbs)解析JSON,因为JAVASCRIPT解析非常方便
var obj = JSON.parse(ds);
弄了一段代码,但是不知道为什么就是不成功,
要求不要已经发布的纯BAT代码,非常复杂,看不懂,基本不能通用。有没有人能够帮忙修改一下代码
  1. <!-- :
  2. @echo off
  3. echo 取金山词霸每日一句数据
  4. pause
  5. set www=
  6. set /p www=输入 "天数"
  7. echo %www%
  8. echo;%www%|mshta "%~f0"
  9. exit /b
  10. -->
  11. <script>
  12. var fso = new ActiveXObject("Scripting.FileSystemObject");
  13. var StdIn = fso.GetStandardStream(0);
  14. var StdOut = fso.GetStandardStream(1);
  15. var url=StdIn.ReadLine();
  16. function Get(N) {var X = new ActiveXObject("Msxml2.XMLHTTP");
  17. X.open("GET", N, false);
  18. X.send("");
  19. return X.responseText;
  20. }
  21. var s1='1';
  22. var d={};
  23. for (var i = 0; i < 10; i++) {
  24. date = new Date();
  25. yd = +date - 86400000*i;
  26. d = new Date(yd);
  27. var yd= d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate();
  28. url = "http://open.iciba.com/dsapi/?date="+yd;
  29. ds = Get(url);
  30. if (ds){
  31. //var obj = JSON.parse(ds);
  32. //var MottoEN=obj.content;
  33. var d[i]=ds;
  34. var data=d[i]+"\n";
  35. }
  36. }
  37. fso.CreateTextFile('X:\ciba.txt',2,true).Write(data);
  38. close();
  39. </script>
复制代码

作者: zaqmlp    时间: 2019-3-10 15:51

  1. /*&cls
  2. @echo off
  3. title 代码可用,扫码头像,感谢赞助;有什么问题,可加QQ956535081及时沟通
  4. cd /d "%~dp0"
  5. cscript -nologo -e:jscript "%~f0" 30
  6. pause&exit /b
  7. */
  8. var fso=new ActiveXObject('Scripting.FileSystemObject');
  9. var http=new ActiveXObject('MSXML2.XMLHTTP');
  10. var today=new Date();
  11. var result='', n=WSH.Arguments(0);
  12. for(var i=0;i<Number(n);i++){
  13.     var day=new Date(today-86400000*i);
  14.     var tmpday=day.getFullYear()+"-"+(day.getMonth()+1)+"-"+day.getDate();
  15.     var daily=getinfo(gettext(tmpday));
  16.     result+=daily+'\r\n\r\n';
  17. }
  18. //WSH.echo(result);
  19. var f=fso.CreateTextFile('dailysentence.txt', 2, true);
  20. f.Write(result);
  21. f.Close();
  22. WSH.Quit();
  23. function gettext(d){
  24.     var url='http://open.iciba.com/dsapi/?date='+d;
  25.     var text='';
  26.     http.open('Get', url, false)
  27.     http.send();
  28.     text=http.responseText;
  29.     return text;
  30. }
  31. function getinfo(s){
  32.     var json=eval('('+s+')');
  33.     var content=json['content'];
  34.     var note=json['note'];
  35.     var translation=json['translation'];
  36.     var dateline=json['dateline'];
  37.     return content+'\r\n'+note+'\r\n'+translation;
  38. }
复制代码

作者: kaze    时间: 2019-3-10 18:31

本帖最后由 kaze 于 2019-3-10 18:47 编辑

回复 2# zaqmlp


    谢谢, 很完美,关键一句话  var json=eval('('+s+')');    虽然不太懂,但是套用一下拉网站数据足够了,for循环怎么倒序呢?
搜了一下,for(var i=Number(n);i>=0;i--)完美解决,
作者: WHY    时间: 2019-3-11 01:29

vbs
  1. rem On Error Resume Next
  2. Dim http, html, strOut, i, dt, ymd, url
  3. Set http = CreateObject("Msxml2.XMLHTTP")
  4. Set html = CreateObject("htmlfile")
  5. strOut = ""
  6. For i = 0 To 9
  7.     dt  = DateAdd("d", -i, date)
  8.     ymd = Year(dt) & "-" & Right(Month(dt) + 100, 2) & "-" & Right(Day(dt) + 100, 2)
  9.     url = "http://open.iciba.com/dsapi/?date=" & ymd
  10.     http.open "GET", url, False
  11.     http.send
  12.     strOut = GetJSON(http.responseText) & vbCrLf & vbCrLf & strOut
  13. Next
  14. Function GetJSON(txt)
  15.     Dim window, json
  16.     Set window = html.parentWindow
  17.     window.execScript "var json = " & txt, "JScript"
  18.     Set json = window.json
  19.     GetJSON = json.content & vbCrLf & json.note & vbCrLf
  20.     GetJSON = GetJSON & json.translation & vbCrLf & json.dateline
  21. End Function
  22. Dim fso
  23. Set fso = CreateObject("Scripting.FileSystemObject")
  24. fso.CreateTextFile("ciba.Log", 2, True).Write(strOut)
  25. MsgBox "Done"
复制代码
PowerShell v3.0
  1. -9..0 | ForEach{$url = 'http://open.iciba.com/dsapi/?date=' + (get-Date).AddDays($_).ToString('yyyy-MM-dd'); (Invoke-WebRequest $url).Content | ConvertFrom-Json | ForEach{$_.content; $_.note; $_.translation; $_.dateline}}
复制代码

作者: kaze    时间: 2019-3-11 12:41

回复 4# WHY


    牛啊,POWERSHELL就一句话,还是JAVASCRIPT好懂
作者: kaze    时间: 2019-3-27 11:37

回复 2# zaqmlp

你好,请问    n=WSH.Arguments(0)是批处理输入JAVASCRIPT的内容,但是如何把解析的内容(指定一行例:mp3网址url_list)返回到批处理变量中呢?中间有用js显示多行内容:WSH.echo(num+'\r\n'+url_list+'\r\n'+list);
后面的想
set /p www=输入u打开网址
echo %www%|findstr "^u$">nul
怎么顺便打开网址。。。
作者: kaze    时间: 2019-3-29 12:16

回复 4# WHY


    你好,请问方便解答一下吗?
   n=WSH.Arguments(0)是批处理输入JAVASCRIPT的内容,但是如何把JS解析的内容(指定一行例:mp3网址url_list)返回到批处理变量中呢?中间有用js显示多行内容:WSH.echo(num+'\r\n'+url_list+'\r\n'+list);
后面的想
set /p www=输入u打开网址
echo %www%|findstr "^u$">nul
怎么顺便打开网址。。。
作者: kaze    时间: 2019-3-31 12:51

本帖最后由 kaze 于 2019-3-31 13:30 编辑

上面的问题还是没有解决呢,有没有人能帮忙看一看我这个小白啊??


作者: zaqmlp    时间: 2019-3-31 19:09

回复 6# kaze
没赞助没动力
作者: kaze    时间: 2019-3-31 20:31

没钱啊,穷人,哎,生活不易,都怪以前没好好学习。
作者: CrLf    时间: 2019-3-31 22:42

工具不少,可以试试
http://bcn.bathome.net/s/tool/index.html?key=json
作者: WHY    时间: 2019-4-1 19:25

回复 7# kaze


    描述看不懂,猜测你是想要这样
  1. @if(0)==(0) echo off
  2. for /f "delims=" %%i in ('cscript //nologo //e:jscript "%~f0" 30') do set "_%%i"
  3. set /p www=输入u打开网址
  4. if /i "%www%" == "u" start "" "%_b%"
  5. pause & exit /b
  6. @end
  7. var num = WSH.Arguments(0);
  8. var url_list = 'www.bathome.net';
  9. var list = 'MyList';
  10. WSH.Echo('a=' + num + '\nb=' + url_list + '\nc=' + list);
复制代码

作者: kaze    时间: 2019-4-2 12:54

回复 12# WHY

感谢回复,要点是不能影响其他字符显示ECHO,按照上面的修改,会显示大批   环境变量 _** 没有定义或者 a=没有显示,变量list是一个包含多个回车符的上一个函数的返回值。
感谢,不过也实现了打开网址的要求,谢谢
作者: kaze    时间: 2019-4-29 12:54

说到底 var obj = JSON.parse(data);等价于  var obj=eval('('+data+')');但是如何还原json对象成json字符串? JSON.stringify(obj)用不了,有人知道么?




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2