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