解析命令提示符输出

解析命令提示符输出

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 后包含空格的列,它也会中断。在这种情况下,标记化非常困难

相关内容