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

[文本处理] 批处理提取XML中指定内容,并赋值

本帖最后由 yyuanstudio 于 2022-3-1 14:03 编辑

各位大佬,请教个问题。

我通过windows的命令winsat formal 生成了个xml文件,想用bat读取里面的内容并赋值显示出来。

但是这个xml不是标准的xml格式,我尝试用了token无法获取想要的信息。请各位大佬赐教~

那个文件我传不上来

我要取SystemScore、MemoryScore 这几个有数值的参数

xml文件内容如下:

<WinSPR>
<SystemScore>8.1</SystemScore>
<MemoryScore>9.1</MemoryScore>
<CpuScore>9.1</CpuScore>
<CPUSubAggScore>8.2</CPUSubAggScore>
<VideoEncodeScore>9.9</VideoEncodeScore>
<GraphicsScore>8.1</GraphicsScore>
<Dx9SubScore>9.9</Dx9SubScore>
<Dx10SubScore>9.9</Dx10SubScore>
<GamingScore>9.9</GamingScore>
<DiskScore>8.65</DiskScore>
<ScoreRaisedDueToHigherPreviousScore>
<ActualDiskScore>8.5</ActualDiskScore>
</ScoreRaisedDueToHigherPreviousScore>
<LimitsApplied>
<GamingScore>
<LimitApplied Friendly="We no longer run the D3D test. Returned scores and metrics are hardcoded sentinel values.">NoD3DTestRun</LimitApplied>
</GamingScore>
</LimitsApplied>
</WinSPR>

  1. @echo off
  2. set var=SystemScore MemoryScore
  3. findstr "%var%" "a.xml"
  4. pause
复制代码

TOP

回复 2# qixiaobin0715


大佬,如果我把上面贴出来的文本单独保存到xml里,这个代码是可以找到的。但通过winsat formal 命令生成的xml文件,用这个代码就不会显示任何东西。

     winsat formal -xml %temp%\WinSAT.xml     这个命令就是电脑性能评估完得到的xml文件。 执行这个命令会使风扇声音变大。

     我把文件分享出来了,大佬帮忙看看,感谢感谢~

     链接:https://pan.baidu.com/s/1h2Wg_gYVYhbiIb_Mh5lWww
     提取码:drir

TOP

这个 XML 格式并非"不标准",只是整改 XML 合并为一行而已。
Powershell 脚本:
  1. [xml](gc WinSAT.xml) | Select-XML '//SystemScore|//MemoryScore' | forEach{$_.Node.Name,$_.Node.innerText}
复制代码
  1. $str = [IO.File]::ReadAllText('WinSAT.xml', [Text.Encoding]::Default);
  2. forEach($m In [regex]::Matches($str, '<(SystemScore|MemoryScore)>[^<>]*</\1>')){
  3.     $m.Groups[0].Value;
  4. }
复制代码

TOP

回复 4# WHY


非常感谢大佬大晚上的帮助,这个脚本确实可以帮我解决了问题。

然后我想加个自定义的输出值,输出结果想变成中文,比如:

以上脚本输出的是:
SystemScore
8.1
MemoryScore
9.1

我现在想变成:

系统分数:8.1
内存分数:9.1

我在尝试添加 forEach {@{name="系统评分" ; expression={$_.Node.Name}},$_.Node.innerText}    没有看到想要的结果。是脚本哪里写错了吗?

TOP

非常谢谢楼上两位大佬,我用其他方法实现了自定义输出结果。
保存成txt,然后再读取进行自定义显示结果。

TOP

回复 5# yyuanstudio
  1. $Hash = @{SystemScore='系统分数'; MemoryScore='内存分数'}
  2. [xml](gc WinSAT.xml) | Select-XML '//SystemScore|//MemoryScore' | forEach{$Hash[$_.Node.Name] + ':' + $_.Node.innerText}
复制代码

TOP

回复 7# WHY


    谢谢大佬~膜拜

TOP

返回列表