[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
楼主如是,就请cmd同门js@cscript出场相助吧,其胃口要比8K大多了,所要的三项数据正好联排,用js可直接定点剥离...
  1. @set @v=1 /*
  2. @echo off
  3. ::输入文件须为ansi(简中编码)
  4. set "jsonF=test.txt"
  5. (cscript.exe -e:jscript "%~f0" "%jsonF%")
  6. pause&exit/b
  7. */
  8. var v=WSH.arguments;
  9. if (v.length==0) WSH.quit();
  10. var fso=new ActiveXObject('scripting.filesystemobject');
  11. var fr=fso.opentextfile(v(0)), all=fr.readall(); fr.close();
  12. var line,nb,ne,line;
  13. for (nb=all.indexOf('\"fileId\":');
  14. nb>0;
  15. nb=all.indexOf('\"fileId\":',ne)) {
  16. ne=all.indexOf('\"fileType\":',nb);
  17. if (ne==-1) break; //遭遇残缺数据则退出
  18. line=all.slice(nb,ne-1);
  19. WSH.echo(line);
  20. }
  21. WSH.quit();
复制代码


关于utf-8文件转为简中(gb2312)编码可以试试如下的PS代码》将指定目录中的全部utf-8文件转为gb213...

  1. @echo off
  2. set "u8D=" &set/p "u8D=拖入一个仅含UTF8编码文件的目录: "
  3. if not defined u8D exit
  4. cd /d %u8D% 2>nul
  5. echo,转换开始...
  6. powershell -nop -c "$dir=dir *.*;foreach($_ in $dir){$txtLines=[System.IO.File]::ReadLines($_.FullName,[text.encoding]::UTF8);[System.IO.File]::WriteAllLines($_.FullName+'.ansi',$txtLines,[text.encoding]::Default)}"
  7. echo,请到 %u8D% 查看转换结果
  8. pause&exit/b
复制代码
1

评分人数

    • lonron: 感谢提供思路技术 + 1

TOP

本帖最后由 lonron 于 2023-4-25 11:19 编辑

回复 16# aloha20200628


    感谢,第二个转换的时候会把我其他同目录文件也一起转换了,不知道为啥。

另外,能否麻烦老师帮忙看下14楼这位老师里面提到的PS的方法,
  1. powershell "((sls '\{.*?\}' 'test.txt' -allmatches).matches.value | convertfrom-json | group 'fileId','fileName').name"
复制代码
我测试过如果用的是我帖子里的例子是可以成功转换的,但是如果用 https://189.ly93.cc/qieiaeUNRrMj?accessCode=? 里的这种就报错了。还有就是它得出的结果用的分隔符是逗号的,实际文件名有可能也存在逗号的情况,所以最好能用别的分隔符来代替,比如“|”。因为“|”在windows的文件名规则中并不被允许保存。

在cmd满足不了的前提下,我个人还是倾向PS一点,主要是代码看起来也简洁点,对我一个小白来说读起来还算能理解。
而且就上面这个PS代码来说貌似也不存在转换编码的问题,我试过当源数据是UTF-8的时候,如果保存的PS文本也是UTF-8,得出的结果不会报错。
因为实际情况是我在爬取网页数据的时候我希望我不用手动另存为其他编码就可以正确截取我要的数据列,而且我的脚本最好保存的也是UTF-8的,所以想尽可能保持数据原样,因为要考虑转换的情况下那代码可能就太长了。

TOP

  1. ((gc .\aa.txt -Encoding UTF8|ConvertFrom-Json).data|group fileId,fileName,fileSize).name
复制代码
回复 15# lonron

TOP

试试这样呢
  1. (gc .\a.txt -Encoding UTF8|ConvertFrom-Json).data.ForEach({"{0}|{1}|{2}" -f $_.fileId,$_.fileName,$_.fileSize  })
复制代码
回复 17# lonron

TOP

本帖最后由 lonron 于 2023-4-25 11:47 编辑

回复 18# terse


   18L的代码这个可以成功读取网页的那种格式了,但是分隔符还是逗号。
19L的代码可以了。

不过这两个代码都加了-Encoding UTF8这个参数是为什么?源数据也是UTF8啊

TOP

回复 20# lonron
源数据是UTF8,有带BOM的,也有不带的,不带的话有时会出错

TOP

回复 21# terse


    好的,真的非常感谢,今天评分用完了,明天我追加给您,谢谢了

TOP

回复 19# terse


    老师,如果我不用gc的方式读取下载下来的本地json文件,而是直接从网页中获取,应该怎么写,我套用iwr时,中文部分乱码了,该如何修改?
  1. powershell "(iwr 'https://189.ly93.cc/qieiaeUNRrMj?accessCode=?&accessToken=B29F77379D3A9977A6C840F8CEF74142' | convertfrom-json).data | % {'{0}|{1}' -f $_.fileId,$_.fileName}"
复制代码

TOP

本帖最后由 terse 于 2023-4-25 17:37 编辑

回复 23# lonron
i除了nvoke-webreques 有几种方法都可以实现 IWR不行的话 这样可以试
  1. powershell "$url='https://189.ly93.cc/qieiaeUNRrMj?accessCode=?&accessToken=B29F77379D3A9977A6C840F8CEF74142';$web=New-Object System.Net.WebClient;$web.Encoding=[System.Text.Encoding]::UTF8;($web.DownloadString($url)| convertfrom-json).data| %% {'{0}|{1}' -f $_.fileId,$_.fileName}"
复制代码
这样也行
  1. $url='https://189.ly93.cc/qieiaeUNRrMj?accessCode=?&accessToken=B29F77379D3A9977A6C840F8CEF74142';((iwr $url).Content| convertfrom-json).data| % {'{0}|{1}' -f $_.fileId,$_.fileName}
复制代码

TOP

本帖最后由 lonron 于 2023-4-25 18:17 编辑

回复 24# terse


    太强了!最后请教老师您两个问题:
    为什么加了.content属性就不会变成乱码了?
    iwr请求指定网址的时候,在控制台显示出来时,数据是保存在内存中的还是有实际路径的?

TOP

回复 25# lonron
大概是convertfrom-json的因素

要么就不用convertfrom-json 直接 irm
  1. $url = 'https://189.ly93.cc/qieiaeUNRrMj?accessCode=?&accessToken=B29F77379D3A9977A6C840F8CEF74142'; (irm $url).data| % {'{0}|{1}' -f $_.fileId,$_.fileName}
复制代码
1

评分人数

    • lonron: 补评分 本帖最终采用此方法技术 + 1

TOP

本帖最后由 lonron 于 2023-5-8 10:49 编辑

回复 26# terse
  1. @echo off
  2. for /f "delims=" %%a in ('curl "https://gitee.com/dm/releases/tag/t"') do (
  3.     for /f "delims=" %%b in ('powershell "(echo '%%a' | ConvertFrom-Json).release.release.title"') do (
  4.         echo %%b
  5.     )
  6. )
  7. pause
复制代码
老师,还请您帮忙看下,还是类似的问题。
不知道为什么只有用curl命令时才会获取到json数据,如果用ps的irm和iwr获取的都只是html数据。
然后有了上面这段代码,结果是报错了。但当我把%%a重定向到文本之后,再用gc方式获取,然后结果是正确的。
或者直接把(echo '%%a' | ConvertFrom-Json).release.release.title 这部分,手动带入%%a的值,然后在ps控制台运行,结果也是正确的。

上面这段代码要怎么修改才能在不需要重定向文本的前提下,直接在cmd脚本里运行就能得到正确结果?

TOP

回复 27# lonron

html数据不能当作Json数据处理把,’https://gitee.com/lonron/dm/releases/tag/t ‘地址里 并没有看到你在27楼描述的 release  title 这部分 你是怎么得到的

TOP

回复 28# terse


    就是第一个for里面的 curl得到的,这个不是ps的iwr别名,就是win10自带的curl命令,您看下返回值。

TOP

本帖最后由 lonron 于 2023-5-8 10:50 编辑

回复 28# terse
  1. @echo off
  2. for /f "delims=" %%a in ('curl "https://gitee.com/dm/releases/tag/t"') do (
  3.     >"test.txt" echo %%a
  4.     for /f "delims=" %%b in ('powershell "(gc 'test.txt' | ConvertFrom-Json).release.release.title"') do (
  5.         echo %%b
  6.     )
  7. )
  8. pause
复制代码
如果改成这样,返回值是我想要的,但是这需要输出到本地文本之后gc读取才行,我希望直接用curl的返回值直接处理,而不需要输出一个实体文本。

TOP

返回列表