基于AutoLisp在DraftSight中调用PowerShell/CMD获取系统信息
在DraftSight中用AutoLisp获取系统信息的问题
我需要在CAD软件DraftSight中通过AutoLisp获取系统信息,目前已完成前期准备,但不清楚如何将外部命令的执行结果回传到AutoLisp程序中。目标获取的信息包括可用内存、CPU使用率百分比以及启用的核心数,已找到多个PowerShell和命令提示符(cmd)命令可获取这些值,但当前执行后返回的是对象,且似乎在外部脚本未执行完成时就提前返回了。
可用的系统信息获取命令
内存相关
PowerShell命令
- 快速(几乎即时)
- 可用内存(MiB):
(Get-WmiObject -Class WIN32_OperatingSystem).FreePhysicalMemory/1024 - 总内存(MiB):
(Get-WmiObject -Class WIN32_OperatingSystem).TotalVisibleMemorySize/1024
- 可用内存(MiB):
- 慢速(约4秒)
$General_Info = systeminfo # 可用内存(MiB) ($General_Info | Select-String 'Available Physical Memory:').ToString().Split(':')[1].Trim() # 总内存(MiB) ($General_Info | Select-String 'Total Physical Memory:' ).ToString().Split(':')[1].Trim()
命令提示符(cmd)命令
- 快速(几乎即时)
- 可用内存(kiB):
wmic OS get FreePhysicalMemory - 总内存(kiB):
wmic OS get TotalVisibleMemorySize
- 可用内存(kiB):
- 慢速(约8秒)
- 可用内存(MiB):
systeminfo | find "Available Physical Memory" - 总内存(kiB):
systeminfo | find "Total Physical Memory"
- 可用内存(MiB):
CPU相关
PowerShell命令
- 中等速度(约0.5秒)
- 负载百分比:
gwmi Win32_PerfFormattedData_PerfOS_Processor | Select -First 1 | %{'{0}%' -f $_.PercentProcessorTime}
- 负载百分比:
- 慢速(约2秒)
- 负载百分比:
(Get-WmiObject win32_processor).LoadPercentage - 启用核心数:
(Get-WmiObject win32_processor).NumberOfEnabledCore
- 负载百分比:
命令提示符(cmd)命令
- 半慢速(约2秒)
- 负载百分比:
wmic cpu get loadpercentage - 启用核心数:
wmic cpu get NumberOfEnabledCore
- 负载百分比:
已尝试的AutoLisp代码(未成功获取返回值)
尝试PowerShell获取CPU负载
(progn (setq WSript (vlax-get-or-create-object "WScript.Shell")) (setq PShell (vlax-invoke WSript 'exec "Powershell.exe (Get-WmiObject win32_processor).LoadPercentage")) (vlax-dump-object PShell) (vlax-release-object WSript) (vlax-release-object PShell) (gc) ) ; 输出: ; IWshExec: WSH Exec Object ; Property values: ; ExitCode = Parameterized properties not displayed ; ProcessID = Parameterized properties not displayed ; Status = Parameterized properties not displayed ; StdErr = Parameterized properties not displayed ; StdIn = Parameterized properties not displayed ; StdOut = Parameterized properties not displayed
尝试cmd获取CPU负载
(progn (setq WSript (vlax-get-or-create-object "WScript.Shell")) (setq PShell (vlax-invoke WSript 'exec "cmd.exe wmic cpu get loadpercentage")) (vlax-dump-object PShell) (vlax-release-object WSript) (vlax-release-object PShell) (gc) ) ; 输出: ; IWshExec: WSH Exec Object ; Property values: ; ExitCode = Parameterized properties not displayed ; ProcessID = Parameterized properties not displayed ; Status = Parameterized properties not displayed ; StdErr = Parameterized properties not displayed ; StdIn = Parameterized properties not displayed ; StdOut = Parameterized properties not displayed
解决方案:正确获取外部命令返回值
要解决这个问题,核心是等待外部命令执行完成,再读取其标准输出流的内容。以下是修正后的代码示例:
获取CPU使用率(PowerShell方式)
(progn (setq WSript (vlax-get-or-create-object "WScript.Shell")) ; 指定PowerShell执行命令并输出纯文本 (setq PShell (vlax-invoke WSript 'exec "Powershell.exe -Command (Get-WmiObject win32_processor).LoadPercentage")) ; 等待命令执行完成(Status=1表示执行完毕) (while (/= (vlax-get PShell 'Status) 1) (vl-cmdf "_delay" 100) ; 延迟100毫秒,避免占用过多资源 ) ; 读取标准输出内容 (setq cpu-load (vlax-get (vlax-get PShell 'StdOut) 'ReadAll)) ; 释放对象并清理内存 (vlax-release-object WSript) (vlax-release-object PShell) (gc) ; 输出结果 (princ (strcat "CPU使用率: " (trim cpu-load) "%")) )
获取启用的核心数(PowerShell方式)
(progn (setq WSript (vlax-get-or-create-object "WScript.Shell")) (setq PShell (vlax-invoke WSript 'exec "Powershell.exe -Command (Get-WmiObject win32_processor).NumberOfEnabledCore")) (while (/= (vlax-get PShell 'Status) 1) (vl-cmdf "_delay" 100) ) (setq enabled-cores (vlax-get (vlax-get PShell 'StdOut) 'ReadAll)) (vlax-release-object WSript) (vlax-release-object PShell) (gc) (princ (strcat "启用的核心数: " (trim enabled-cores))) )
获取可用内存(cmd快速方式)
(progn (setq WSript (vlax-get-or-create-object "WScript.Shell")) ; 执行wmic命令并过滤表头和空行,只保留数值 (setq PShell (vlax-invoke WSript 'exec "cmd.exe /c wmic OS get FreePhysicalMemory | findstr /r /v \"^$\" | findstr /v \"FreePhysicalMemory\"")) (while (/= (vlax-get PShell 'Status) 1) (vl-cmdf "_delay" 100) ) (setq free-mem-kb (vlax-get (vlax-get PShell 'StdOut) 'ReadAll)) ; 转换为MiB单位 (setq free-mem-mib (/ (atof (trim free-mem-kb)) 1024)) (vlax-release-object WSript) (vlax-release-object PShell) (gc) (princ (strcat "可用内存: " (rtos free-mem-mib 2 2) " MiB")) )
关键注意点
- 执行PowerShell命令时需添加
-Command参数,确保输出为纯文本而非对象。 - 通过循环等待
Status属性变为1,确保外部命令完全执行后再读取结果。 - 使用
StdOut对象的ReadAll方法获取完整输出,对cmd命令需过滤掉表头和空行。 - 用
vl-cmdf "_delay"添加短延迟,避免循环占用过多CPU资源。
内容的提问来源于stack exchange,提问作者G Beck
相关产品推荐
相关产品推荐

