本帖最后由 zml84 于 2025-7-12 17:24 编辑
https://mp.weixin.qq.com/s/ldUFafBUCXxJcBlrSkaEmQ
 - (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)
- )
源码位置:https://tool.zml84.xyz/lisp/view/?uuid=cc00eccd-6fcc-4435-b963-d961aa25a461
|