lisp代码查看(获取指定文件的MD5)

(vl-load-com)
;;;=================================================================*
;;;      定义函数                                                   *
;;;功能:获取指定文件的MD5                                          *
;;;参数:filename ----- 文件名称。                                  *
;;;返回:若成功,返回32位字符串。若失败,返回nil。                  *
;;;日期:zml84 于 2025-04-26                                        *
;;;--------------------------------
;;;备忘:
;;;1、等待机制:通过 while 循环持续检查 Status 属性,直到命令完成
;;;
;;;2、输出读取:
;;; StdOut.ReadAll 获取标准输出
;;; StdErr.ReadAll 获取错误输出
;;;
;;;3、状态码:
;;; 0 = 运行中
;;; 1 = 成功完成
;;; 2 = 失败
;;; 
;;;4、资源释放:使用 vlax-release-object 防止内存泄漏
;;;--------------------------------
(defun fun-MD5 (filename / shell cmd exec stdout stderr status)
    (if (and 
            (findfile filename)
            (setq shell 
                (vlax-create-object "WScript.Shell")
            )
        )
        (progn 
            ;; 构建命令行 
            (setq cmd 
                (strcat "certutil -hashfile \"" filename "\" MD5"
                )
            )
            ;; 执行命令 
            (setq exec 
                (vlax-invoke shell 'Exec cmd)
            )
            ;; 等待命令执行完成 
            (while 
                (zerop (vlax-get-property exec 'Status))
                (vlax-get-property exec 'Status) ; 空循环等待 
            )
            ;; 记录执行结果 
            (setq stdout 
                (vlax-invoke-method 
                    (vlax-get-property exec 'StdOut) "ReadAll" 
                )
            )
            (setq stderr 
                (vlax-invoke-method 
                    (vlax-get-property exec 'StdErr) "ReadAll" 
                )
            )
            (setq status 
                (vlax-get-property exec 'Status)
            ) ;_状态码 
            ;; 清理 COM 对象 
            (vlax-release-object exec)
            (vlax-release-object shell)
;;;     ;; 显示结果
;;;     (princ (strcat "\n标准输出: \n" stdout))
;;;     (princ (strcat "\n错误信息: \n" stderr))
;;;     (princ (strcat "\n状态码: " (itoa status)))
            ;; 返回 
            (if 
                (and 
                    (= status 1)
                    (setq i (vl-string-search "\r\n" stdout))
                )
                (substr stdout (+ i 3) 32)
            )
        )
    )
)
;;;=================================================================*
;;;功能:测试
(defun c:tt(/ filename)
    (princ "测试:计算文件的MD5")
    (if 
        (setq filename 
            (getfiled "选择要计算哈希的文件" "" "*" 16)
        )
        (print (fun-md5 filename))
    )
    (princ)
)
zml84 于 2025-04-26 17:20:00