You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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
  • 慢速(约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
  • 慢速(约8秒)
    • 可用内存(MiB):systeminfo | find "Available Physical Memory"
    • 总内存(kiB):systeminfo | find "Total Physical Memory"

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"))
)

关键注意点

  1. 执行PowerShell命令时需添加-Command参数,确保输出为纯文本而非对象。
  2. 通过循环等待Status属性变为1,确保外部命令完全执行后再读取结果。
  3. 使用StdOut对象的ReadAll方法获取完整输出,对cmd命令需过滤掉表头和空行。
  4. 用vl-cmdf "_delay"添加短延迟,避免循环占用过多CPU资源。

内容的提问来源于stack exchange,提问作者G Beck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:55