wmic
我正在使用语句通过 JavaScript 检索磁盘信息wmic logicaldisk get freespace,name,size,volumename
,该语句会产生以下输出,但在单个字符串中。
"FreeSpace Name Size VolumeName "
"560232755200 C: 999526756352 System "
"999369699328 D: 999558213632 SSD "
"1511570386944 E: 8001545039872 Get "
"4620751712256 F: 8001545039872 BR "
"788449492992 G: 4000650883072 Seen "
"2296009408512 H: 4000768323584 Seen 2 "
"3594248679424 I: 8001545039872 2160 "
"3507750227968 J: 8001545039872 1080 "
"945300619264 K: 999625322496 Trailers "
我使用以下 JavaScript 解析上述输出。
window.onload = function(){
const cp = require('child_process')
let drives
cp.exec('wmic logicaldisk get freespace,name,size,volumename', (error, stdout)=>{
drives = stdout.trim().split('\r\r\n')
.map(value => value.trim().split(/\s{2,0}/))
.slice(1)
})
}
该 JavaScript 已经生成了我想要的输出。它生成一个嵌套数组的数组。命令提示符输出中的每一行信息都对应一个嵌套数组。每个嵌套数组都有四个值,它们对应于最初查询的数据点。
[
["560232439808", "C:", "999526756352", "System" ]
["999369699328", "D:", "999558213632", "SSD" ]
["1511570386944", "E:", "8001545039872", "Get" ]
["4620751712256", "F:", "8001545039872", "BR" ]
["788449492992", "G:", "4000650883072", "Seen" ]
["2296009408512", "H:", "4000768323584", "Seen 2" ]
["3594248679424", "I:", "8001545039872", "2160" ]
["3507750227968", "J:", "8001545039872", "1080" ]
["945300619264", "K:", "999625322496", "Trailer" ]
]
我想知道是否有办法以类似的方式解析信息,但使用命令提示符?
答案1
我相信部分原因是你的正则表达式
.map(value => value.trim().split(/\s+/))
/\s+/ 抓取了我测试的输出中的所有空格
我编写了一个快速正则表达式字符串,虽然它有点混乱,而且可能无法捕获所有内容,但它可能会有所帮助。不过,我用你提供的输出对其进行了测试,它确实有效。所以值得一试。
/(\d)*(\s)*(\w:)(\s)*(\d)*(\s)*(\w(\s)?)*/gim
答案2
输出的问题wmic
只是回车符 (CR)。可以在 cmd 中解决这个问题,但由于无法修复的遗留问题和缺乏工具,情况会变得更加混乱。这就是为什么 MS 不修复这个问题,而是从头开始编写一个名为 PowerShell 的新 shell。请只使用 PowerShell 编写新代码,避免使用 cmd。尝试以下命令,您将立即获得格式良好的列表。然后您可以轻松地对列表进行任何操作
Get-WmiObject -Class Win32_LogicalDisk | Select-Object Name, FreeSpace, Size, VolumeName
Get-WmiObject -Class Win32_LogicalDisk
Get-WmiObject -Class Win32_LogicalDisk | Format-List -Property Name, FreeSpace, Size, VolumeName
Get-WmiObject -Class Win32_LogicalDisk | Format-List -Property *
如果你真的想在 cmd 中执行,那么这里是代码
@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Get CR, LF and TAB characters
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
(set LF=^
%=EMPTY=%
)
for /f "delims= " %%t in ('forFiles /p "." /m "%~nx0" /c "cmd /c echo(0x09"') do set "TAB=%%t"
rem Parse the command
for /f "tokens=* delims=" %%a in ('wmic logicaldisk get freespace^,name^,size^,volumename') do (
set "line=%%a"
rem Remove the CR character from each line
for /f "delims=" %%c in ("!CR!") do set "line=!line:%%c=!"
rem Parse each line
for /f "tokens=1-3,* delims= " %%f in ("!line!") do (
echo %%f !TAB! %%g !TAB! %%h !TAB! %%i
)
)
卷名可以包含空格,因此您必须使用*
最后一个标记来捕获所有内容。示例输出:
C:\>wmic logicaldisk get freespace,name,size,volumename & parse_wmic.bat
FreeSpace Name Size VolumeName
87090261312 C: 248695820288 Windows 10
189214661732 E: 637248991232 Data
F:
FreeSpace Name Size VolumeName
87090261312 C: 248695820288 Windows 10
189214661732 E: 637248991232 Data
F:
如您所见,许多驱动器(如 CD/DVD 驱动器)没有大小或名称,因此解析会中断。如果您使用 cmd,则需要更多代码来修复此问题。如果您需要任何可以在 VolumeName 后包含空格的列,它也会中断。在这种情况下,标记化非常困难