hubeiwdlue 发表于 2025-3-1 12:22:42

根据高飞大神函数利用powershell实现多文件选择对话框

本帖最后由 hubeiwdlue 于 2025-3-1 13:19 编辑

   我没有powershell的知识,也不会写命令流,只是借助ai,将高飞鸟大师的函数修改了一点点。增加了3个参数,分别是对话框的名称、初始目录,后缀过滤,并将PowerShell弹窗隐藏了,打开返回地址列表,取消返回nil。但是最初还是会闪一下蓝色的窗口。
    (vlax-invoke wsh 'Run myCommand 0 1)返回的是0,而不是地址,不然用这个方法窗口不会闪。
高飞大神的帖子
http://bbs.mjtd.com/thread-192194-1-1.html


(defun hfb:filesDlg (title initDir filter / lst mycommand mysplit res txt wsh)
;;;分割字符串
(defun mysplit (str delim / lst i len)
    (setq len (strlen delim))
    (setq ch (ascii delim))
    (while (setq i (vl-string-position ch str));(vl-string-search delim str)
      (setq lst (cons (substr str 1 i) lst))
      (setq str (substr str (+ 1 len i)))
    )
    (setq lst (cons str lst))
    (reverse lst)
)
(setq myCommand;; 构建PowerShell命令字符串
    (strcat
      "powershell.exe -WindowStyle Hidden -Command ";; 调用PowerShell解释器
      "Add-Type -AssemblyName System.Windows.Forms; ";; 加载Windows窗体组件(@ref)
      "$dialog = New-Object System.Windows.Forms.OpenFileDialog; ";; 创建文件对话框对象
      "$dialog.Multiselect = $true; ";; 启用多选模式(@ref)
      (strcat "$dialog.Title = '" title "'; ");; 设置对话框标题(需转义单引号)
      (strcat "$dialog.InitialDirectory = '" initDir "'; ");; 设置初始目录为用户文档(@ref)
      (strcat "$dialog.Filter = '文本文件 (*." filter ")|*." filter "|所有文件 (*.*)|*.*'; ");; 文件类型过滤器(@ref)
      "$dialogResult = $dialog.ShowDialog(); ";; 显示对话框并获取结果
      "if ($dialogResult -eq ::OK) {";; 判断是否点击确定
      "   $selectedFiles = $dialog.FileNames ; ";; 获取所选文件全路径数组
      "   $selectedFiles | ForEach-Object {Write-Host $_}";; 逐行输出文件路径(@ref)
      "}"
    )
)
(if (and
      (setq wsh (vlax-create-object "wscript.shell"));; 创建WScript.Shell COM对象
      (setq res (vlax-invoke wsh 'exec myCommand));; 执行PowerShell命令
      (setq txt (vlax-invoke (vlax-get res 'stdout) 'readall));; 读取标准输出内容
      )
    (progn
      (setq lst (mysplit txt "\n"));; 自定义函数分割换行(假设mysplit已定义)
      (setq lst (vl-remove "" lst));; 移除空行
    )
)
(vlax-release-object wsh);; 释放COM对象
lst;; 返回文件路径列表
)
(hfb:filesDlg "试验" "D:\\" "txt")

ssyfeng 发表于 2025-3-1 13:12:15

这句漏了个斜杠(hfb:filesDlg "试验" "D:\" "txt")
(hfb:filesDlg "试验" "D:\\" "txt")

VBALISPER 发表于 2025-3-2 00:40:02

PowerShell弹窗没有隐藏住。WIN11系统

hubeiwdlue 发表于 2025-3-2 09:31:16

VBALISPER 发表于 2025-3-2 00:40
PowerShell弹窗没有隐藏住。WIN11系统

我没有win11系统,我是用win10ltsc测试的。

VBALISPER 发表于 2025-3-2 16:33:15

我在另一台win10ltsc下测试,确实可以隐藏背景窗口。

chslwj521 发表于 2025-3-3 16:30:25

(hfb:filesDlg "试验" "D:\\" "txt")你少一反斜扛呀,反回了一个地址表,已证可用("D:\\材质设置-0905.txt")
页: [1]
查看完整版本: 根据高飞大神函数利用powershell实现多文件选择对话框