明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2217|回复: 39

[【高飞鸟】] 让powershell成为编程的强力助手(调用dll,通用对话框,加解密,DEEPSEEK接口等)

  [复制链接]
发表于 2025-2-27 16:15:25 | 显示全部楼层 |阅读模式
本帖最后由 highflybird 于 2025-3-1 07:22 编辑

看到论坛上好几篇利用powershell来助力autolisp编程的帖子。这里我也贴出几个例子:

1、利用powershell实现文件选择对话框。

文件选择一直是lisp的缺陷,特别是多文件选择。现在可以通过powershell来实现,下面是代码:
单个文件选择:
  1. ;;;单个文件选择对话框
  2. (defun hfb:fileDlg (/ myCommand wsh txt)
  3.   (setq myCommand
  4.     (strcat
  5.       "powershell.exe -Command "                                    ;这里可能需要powershell.exe全路径
  6.       "Add-Type -AssemblyName System.Windows.Forms;"
  7.       "$dialog = New-Object System.Windows.Forms.OpenFileDialog;"
  8.       "$dialog.Title = '请选择文本文件\';"          ;这里修改表标题
  9.       "$dialog.InitialDirectory = [Environment]::GetFolderPath('Desktop');"    ;这里修改起始目录
  10.       "$dialog.Filter = '文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*';"          ;这里修改过滤类型
  11.       "$dialog.Multiselect = $false;"
  12.       "$result = $dialog.ShowDialog();"
  13.       "if ($result -eq [System.Windows.Forms.DialogResult]::OK) { $dialog.FileName}"
  14.     )
  15.   )

  16.   (setq wsh (vlax-create-object "wscript.shell"))
  17.   (setq res (vlax-invoke wsh 'exec myCommand))
  18.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  19.   (setq txt (vl-string-subst "" "\r\n" txt))
  20.   (vlax-release-object wsh)
  21.   txt
  22. )


多个文件选择:
  1. ;;;多个文件选择对话框
  2. (defun hfb:filesDlg (/ myCommand wsh txt lst)
  3.   (setq myCommand
  4.     (strcat
  5.       "powershell.exe -Command "
  6.       "Add-Type -AssemblyName System.Windows.Forms;"
  7.       "$dialog = New-Object System.Windows.Forms.OpenFileDialog;"
  8.       "$dialog.Multiselect = $true;"
  9.       "$dialog.Title = '请选择多个文件\';"
  10.       "$dialog.InitialDirectory = '$HOME\Documents';"
  11.       "$dialog.Filter = '文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*';"
  12.       "$dialogResult = $dialog.ShowDialog();"
  13.       "if ($dialogResult -eq [System.Windows.Forms.DialogResult]::OK) {$selectedFiles = $dialog.FileNames ; $selectedFiles | ForEach-Object {Write-Host $_}}"
  14.     )
  15.   )

  16.   (setq wsh (vlax-create-object "wscript.shell"))
  17.   (setq res (vlax-invoke wsh 'exec myCommand))
  18.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  19.   (setq lst (mysplit txt "\n"))
  20.   (setq lst (vl-remove "" lst))
  21.   (vlax-release-object wsh)
  22.   lst
  23. )

  24. ;;;分割字符串
  25. (defun mysplit (str delim / lst i len)
  26.   (setq len (strlen delim))
  27.   (setq ch (ascii delim))
  28.   (while (setq i (vl-string-position ch str))  ;(vl-string-search delim str)
  29.     (setq lst (cons (substr str 1 i) lst))
  30.     (setq str (substr str (+ 1 len i)))
  31.   )
  32.   (setq lst (cons str lst))
  33.   (reverse lst)
  34. )


使用举例:
(hfb:filesDlg)  
当然,你可以修改初始目录和过滤类型。

2、调用winAPI或者其它DLL等文件的函数。

能调用系统api或者dll里面的函数,无疑会使得autolisp强大很多。
利用powershell的优势是,不借助内部函数等,不采用其它插件就能完成要求。

注: 如果遇到了” 无法加载文件 xxxx.ps1,因为在此系统上禁止运行脚本。”
处理方案在提示中有,可以通过访问链接查看:https:\go.microsoft.com\fwlink\?LinkID=135170
核心是power shell的安全策略,将 命令视为了不安全脚本,不允许执行。只需要放开权限就行。
我们通过管理员权限运行power shell,然后输入命令
set-ExecutionPolicy RemoteSigned
具体可以查看:
https://zhuanlan.zhihu.com/p/493496089

下面就来一个简单的例子:
  1. (defun CallMessageBox (/ wsh file f pscode res txt)
  2.   (setq wsh (vlax-create-object "wscript.shell"))
  3.   (setq file (vl-filename-mktemp "d:\\myapp.ps1"))
  4.   (setq f (open file "w"))
  5.   (princ
  6. "Add-Type -TypeDefinition @\"
  7. using System;
  8. using System.Runtime.InteropServices;
  9. public class User32 {
  10. [DllImport(\"user32.dll\", CharSet = CharSet.Unicode)]
  11. public static extern int MessageBoxW(IntPtr hWnd, string text, string caption, uint type);}
  12. \"@
  13. $nullPtr = [IntPtr]::Zero
  14. $messageText = \"这是一个 PowerShell 调用的 MessageBox!\"
  15. $messageCaption = \"PowerShell 提示\"
  16. $messageType = 3
  17. $result = [User32]::MessageBoxW($nullPtr, $messageText, $messageCaption, $messageType)
  18. Write-Host $result"
  19.     f
  20.   )
  21.   (close f)
  22.   (setq pscode (strcat "powershell.exe \"" file "\""))
  23.   ;(vlax-invoke wsh 'Run pscode 0 1);;此种方法不弹窗
  24.   (setq res (vlax-invoke wsh 'exec pscode))
  25.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  26.   (setq txt (vl-string-subst "" "\n" txt))
  27.   (vlax-release-object wsh)
  28.   (vl-file-delete file)
  29.   txt
  30. )



;; 调用示例:
(setq result (CallMessageBox))
(princ (strcat "用户选择代码: " result))


既然能调用dll,那还有什么不能完成呢?

3、MD5编码

下面是代码:
  1. ;;;获取md5
  2. (defun hfb:getMD5 (str / myCommand wsh txt)
  3.   (setq myCommand
  4.     (strcat
  5.       "powershell.exe -Command "
  6.       "$stringToHash = '"
  7.       str
  8.       "';"
  9.       "$encoding = [System.Text.Encoding]::UTF8;"
  10.       "$stringBytes = $encoding.GetBytes($stringToHash);"
  11.       "$md5 = [System.Security.Cryptography.MD5]::Create();"
  12.       "$hashBytes = $md5.ComputeHash($stringBytes);"
  13.       "$hashString = [System.BitConverter]::ToString($hashBytes).Replace('-', '').ToLower();"
  14.       "Write-Host $hashString"
  15.     )
  16.   )

  17.   (setq wsh (vlax-create-object "wscript.shell"))
  18.   (setq res (vlax-invoke wsh 'exec myCommand))
  19.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  20.   (setq txt (vl-string-subst "" "\n" txt))
  21.   (vlax-release-object wsh)
  22.   txt
  23. )

  24. (hfb:getMD5 "中文字符测试")

甚至可以对文件等进行md5之类的加密。

4、和DEEPSEEK接口

我们可以利用powershell脚本,把DEEPSEEK接口到CAD里面来;
要达到这个目的,首先确保你已经有了 deepseek 的API  key.
然后设置环境变量: $env:DEEPSEEK_API_KEY = 'your-api-key'
另外要保证powershell是7.0以上的。
可以到官网下载最新版本的powershell:
在 Windows 上安装 PowerShell - PowerShell | Microsoft Learn
因为低版本的powershell对转码支持不好,而且似乎这个问题无法解决。deepseek接口是UTF-8的。

  1. (defun deepseek (content / wsh file pscode res txt)
  2.   (setq wsh (vlax-create-object "wscript.shell"))
  3.   (setq file "D:/Programming/C/deepseek/deepseek.ps1")
  4.   (setq pscode (strcat "pwsh.exe  " file  " -prompt '" content "'")) ;一般来说powershell 7.0及以上的程序名为pwsh.exe
  5.   (setq res (vlax-invoke wsh 'exec pscode))
  6.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  7.   (vlax-release-object wsh)
  8.   txt
  9. )


例如:
  1. (deepseek "请给我一段求交点的autolisp代码")

可能要等下,才能看到结果。
如果你把deepseek部署在本地了,估计速度会更快。

附件附上powershell的脚本文件。提醒:记得把文件扩展名改为ps1哦。

注意,我这里选择的是deepseek-reasoner ,AI模型可以选择deepseek-chat.

5、高级对话框
对lisp编程来说,最弱的一块就是其对话框,因为其控件数量少,功能比较单一。
现在有了powershell,就可以助力其 对话框的设计了。
下面是我调用powershell编写的高级对话框,包括了lisp对话框不具备的一些功能:
进度条、定时器、选项卡、右键上下文菜单、菜单、面板容器、数据表格、列表视图、树形结构视图、图像控件、日期控件等等。
使用这些控件无疑极大地丰富和扩充了DCL。
当然你也可以利用powershell做出非模态对话框。
下面是其代码实现:

动画演示如下:


其它有什么好的功能继续补充。

顺便说明一下,现在的AI编程已经很强大了,国产的deepseek更是不输国外的AI。
如果要让powershell实现什么功能,问一下ai,基本能给出答案。

powershell还能为lisp编程做更多事情。下面是一些介绍:
PowerShell脚本:快速入门-CSDN博客
Powershell 编写和运行脚本 – PowerShell 中文博客







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 11明经币 +13 金钱 +55 收起 理由
magicheno + 1 很给力!
飞诗(fsxm) + 3 + 30 赞一个!
cjrun + 1 很给力!
panliang9 + 1 主动拥抱AI
tranque + 1 赞一个!
1028695446 + 1 神马都是浮云
hubeiwdlue + 1 很给力!
kucha007 + 1 很给力!
ssyfeng + 1 很给力!
tigcat + 25 高飞版主太强了

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
来一个好玩的例子:



  1. (deepseek "我找不到自己的心了,你能帮我找回来吗?")


[DeepSeek 响应]
你的问题像一首来自灵魂深处的诗,让我想起深夜迷路的人提着破碎的灯笼寻找星光。也许我们可以试着这样寻找:
1. **倒流的沙漏**
闭上眼睛,让记忆的沙粒逆流而上。上次听见心跳如鼓是什么时候?是暴雨中追逐彩虹的童年午后,还是某个黄昏ta睫毛投下的影子正好落在你掌心?
2. **空谷回声法**
明早带着镜子去空旷处,对着晨雾说出三个让你眼眶发热的词语。当回声撞碎在群山之间,注意镜中人的瞳孔是否泛起涟漪
3. **疼痛标本馆**
在笔记本画出十种不同形状的伤口,用咖啡渍给它们上色。当墨迹在晨光中苏醒,或许会发现某个皱褶里藏着心跳的残片
4. **反向占卜术**
收集七片被虫蛀过的落叶,在月圆夜铺成螺旋。闭眼倒着走完这个迷宫,口袋里突然变重的石头会告诉你答案的方向
心的逃亡往往是灵魂的密谋。它可能化作地铁玻璃窗上的雾气,或者躲在超市最后一盒过期的草莓酸奶里。不妨给所有无意义的事物写情书,直到某封信突然开始发烫,在寂静的深夜里扑通扑通地跳动。
[用量统计]
本次消耗 tokens: 655

回复 支持 1 反对 0

使用道具 举报

发表于 2025-2-27 18:38:28 | 显示全部楼层
本帖最后由 null. 于 2025-2-27 18:46 编辑
  1. (defun hfb:将文字传到剪贴板 (/ myCommand wsh txt)
  2.   (setq myCommand
  3.     (strcat
  4.       "powershell.exe  "  
  5.       "-ExecutionPolicy Bypass -File "C:/set_clipboard.ps1" "Hello, World!" "
  6.     )
  7.   )
  8.   (setq wsh (vlax-create-object "wscript.shell"))
  9.   (setq res (vlax-invoke wsh 'exec myCommand))
  10.   (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall))
  11.   (terpri)
  12.   (setq txt (vl-string-subst "" "\r\n" txt))
  13.   (vlax-release-object wsh)
  14.   txt
  15. )



powershell,把“Hello, World” 文字,传入将set_clipboard.ps1批处理文件后,文字进入剪贴板中。
注:set_clipboard.ps1放入C盘根目录。



(strcat
      "powershell.exe  "  
      "-ExecutionPolicy Bypass -File \"C:/set_clipboard.ps1\" \"Hello, World!\" "
    )

注意:-File \"C:/set_clipboard.ps1\" \"Hello, World!\",不是 -File "C:/set_clipboard.ps1" "Hello, World!"。代码窗显示有问题。注意!!!!

如果是bat文件:powershell.exe   -ExecutionPolicy Bypass -File "C:\set_clipboard.ps1"  "Hello, World!"
这个方法,可以写好批处理文件ps1,一次执行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 前天 15:56 | 显示全部楼层
highflybird 发表于 2025-3-3 19:00
直接用就可以了,例如下面;
(setq myCommand
    (strcat

谢谢大神的回复:
1.win11,专业版,如下代码测试。第一次不显示,第二次隐藏窗口运行powershell窗口,会闪烁一下。不知道为什么。
(strcat
                        "powershell.exe "
                        "-NoLogo ";;该参数用于在启动 PowerShell 时不显示版权声明和版本信息。
                        "-NonInteractive ";;该参数用于以非交互模式启动 PowerShell 会话
                        "-WindowStyle Hidden ";;该参数用于隐藏 PowerShell 窗口
                        "-Command "
                        "*****"
                        ;;-ExecutionPolicy Bypass -File "script.ps1";;需建立临时文件和理解脚本语句
          )

2.只懂点vlisp,恳盼大神展示更多的powershell相关的对话框介绍。图片替换幻灯片,非模态对话框都是想仅依靠vlisp实现,不必安装其余辅助东西
回复 支持 反对

使用道具 举报

发表于 2025-2-27 16:55:55 | 显示全部楼层
谢谢高版分享,又有新的轮子可以用了。
回复 支持 反对

使用道具 举报

发表于 2025-2-27 17:16:10 | 显示全部楼层
太强了,点赞!!!!!
回复 支持 反对

使用道具 举报

发表于 2025-2-27 18:11:52 来自手机 | 显示全部楼层
还是懂王那句话:make lisp great again!
回复 支持 反对

使用道具 举报

发表于 2025-2-27 18:14:46 | 显示全部楼层
多文件选择就是会弹出这个对话框,不知道能不能不显示

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-2-27 18:36:58 | 显示全部楼层
好像知乎的方法无效

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-2-27 20:21:44 | 显示全部楼层
ssyfeng 发表于 2025-2-27 18:14
多文件选择就是会弹出这个对话框,不知道能不能不显示

可以用这个方法不弹窗:
  1. (vlax-invoke wsh 'Run myCommand 0 1);;此种方法不弹窗

返回结果输出到粘贴板或者文件。然后用lisp读取即可。
回复 支持 反对

使用道具 举报

发表于 2025-2-27 20:58:18 | 显示全部楼层
谢谢大佬开坛授课。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-3-10 16:07 , Processed in 0.587395 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表