二零一八小王子 发表于 2024-8-31 21:32

【QTTabBar】手把手教你QTTabBar命令栏js脚本的自定义开发与实战

本帖最后由 二零一八小王子 于 2024-9-2 10:37 编辑



众所周知,360压缩有一个解压功能,也就是打开压缩包后点击“一键解压”就可解压完成并且打开目标文件夹。

今天这里要实现的是在qttabbar的命令按钮,也就是上面的工具栏处,使用js编写一个一键解压功能。也就是对于一个压缩包解压后那么自动打开对应文件夹,对于多个选中的压缩包那么打开第一个或者最后一个压缩包对应的文件夹,根据系统判断的来确定。

该代码解压过程中已经考虑到了将压缩包文件名作为文件夹名称,防止解压带来一片狼藉的问题。

使用代码的前情需要:你是使用qttabbar的用户,你是对命令按钮有需求的用户,该代码主要是让你学会怎么使用js来编写满足自己需求的功能。


1 新建一个txt改为.js,在里面写代码如下面所示(如果你的winrar路径不是正常默认路径请在代码位置里面修改)。
2 将该js代码命名为:解压文件.js,后面需要使用
3 按照下面图片的方法,调出命令栏


4 按照下图添加自定义项目

5 其中④写的是【%SystemRoot%\System32\wscript.exe 】不含中括号,⑤填写的是 解压文件.js 的所在绝对路径。这样一来,使用的时候,只需要在当前文件夹选中一个或者多个压缩包,点击【一键解压】就可以完成解压文件了。


【解压文件.js】的代码内容如下:
var qs = new ActiveXObject("QTTabBarLib.Scripting"); // 获取QTTabBar脚本根对象
var wnd = qs.activewindow; // 获取当前活动的文件夹窗口
var activeTab = wnd.ActiveTab;
var currentPath = activeTab.Path; // 当前文件夹
var fso = new ActiveXObject("Scripting.FileSystemObject");
var shell = new ActiveXObject("WScript.Shell");

if (wnd) {
      var selectedItems = wnd.SelectedItems; // 获取选中的项目
      if (selectedItems.Count > 0) {
                // 检查所有选中的项目是否都是归档文件
                var allAreArchives = true; // 假设所有文件都是归档文件,直到发现不是为止
                var archives = []; // 存储所有归档文件的路径
                for (var i = 0; i < selectedItems.Count; i++) {

                        var rarFilePath = selectedItems.Item(i); // 获取文件名
                        //qs.alert(rarFilePath);
                        if (isRAR(rarFilePath))
                        {
                              // 如果是归档文件,保存文件路径
                              archives.push(rarFilePath);
                        } else
                        {
                              allAreArchives = false; // 如果有任何文件不是归档文件,标记为false
                              break; // 不需要再检查其他文件
                        }
                }

                // 根据结果弹出提示
                if (allAreArchives) {
                        // =====================================全是归档文件,开始解压================================
                        var extractFolder = currentPath; // 选择解压到当前窗口目录
                        for (var j = 0; j < archives.length; j++) {
                              
                              var archive = archives; //选中的压缩包列表提取第j个绝对路径
                              
                              // x代表的是解压文件
                              // -ad 表示以压缩包文件名作为解压后的文件夹,防止解压在当前文件夹带来的散乱现象         
                              // archive代表待解压的压缩包路径,这里是选中的对象的全路径。
                              // extractFolder 代表的是解压的文件夹目标,这里即当前文件夹
                              
                              /*在 Windows 上,通过命令行运行包含空格或特殊字符的路径时,需要将这些路径用双引号包围。
                              为了防止 archive 或 extractFolder 中的空格或特殊字符
                              (如 -)导致命令行解析错误,我们可以在构建命令字符串时对这些路径进行适当的处理。
                              */
                              
                              //根据实际路径修改
                              var command_extract = '"C:\\Program Files\\WinRAR\\WinRAR.exe" x -ad "' + archive + '" "' + extractFolder + '"';

                              try {
                                        shell.exec(command_extract); // 运行解压命令,等待完成
                              }
                              catch(err) {
                                        qs.alert("解压过程中发生错误: " + err.message +"\n"+"或者是你的文件夹路径太长导致的!");
                              }
                        }
                        
                        //=========================上面全部解压完成,需要打开一个目标文件夹=========================
                        //如果只有一个文件那么打开这个目标文件夹,否则打开选择的多个里面的第一个
                        var archive_fullpath = archives;

                        // 使用 GetFileName 获取文件名称,包括后缀
                        var fileNameWithExtension = fso.GetFileName(archive_fullpath);

                        // 去除后缀,获取文件名
                        var fileNameWithoutExtension = fileNameWithExtension.substring(0, fileNameWithExtension.lastIndexOf("."));

                        var targetFolder = currentPath + "\\" + fileNameWithoutExtension
                        //qs.alert(targetFolder)
                        // 如果 targetFolder 包含空格或特殊字符,那么你应该将其用双引号包围,以确保命令行能够正确解析路径。
                        var command_open_target_folder = 'explorer "' + targetFolder + '"';

                        try {               
                                       
                              // 等待 1 秒 (1000 毫秒) 后打开文件夹,因为前面文件夹还未必已经建立完毕,故而加入等待                              
                              WScript.Sleep(1000); // 2000 毫秒 = 2 秒
                              shell.exec(command_open_target_folder);

                                 
                              
                        }                        
                        catch(err) {
                              qs.alert("无法打开文件夹: " + err.message);
                        }
                        

                        // qs.alert("所有压缩包已解压到当前目录。");
                } else {
                        qs.alert("并非所有选中的项都是压缩包,请重新选择");
                }
      }

      else { //没有任何选中
                qs.alert("没有选中的项。"); // 如果没有选中任何文件
      }
}


function isRAR(fileName) {
      var suffix = ''; // 后缀获取
      var result = ''; // 获取类型结果
      if (fileName) {
                var fileArr = fileName.split('.'); // 根据.分割数组
                suffix = fileArr; // 取最后一个
      }
      if (!suffix) return false; // fileName无后缀返回false
      suffix = suffix.toLocaleLowerCase(); // 将后缀所有字母改为小写方便操作
      suffix = '.' + suffix; //字符串拼接
      // 定义归档文件类型的后缀名列表
      var rarList = ['.rar', '.zip', '.7z', '.tar', '.gz', '.bz2', '.xz', '.iso', '.cab', '.arj', '.lzh', '.ace'];

      var result;
      for (var i = 0; i < rarList.length; i++) {
                if (rarList === suffix) {
                        result = rarList;
                        break;
                }
      }

      if (result)

      {
                return true;
      } else {
                return false;
      }

}


参考资料:
1 http://qttabbar.wikidot.com/scripting
2 https://sspai.com/post/52521


【解压文件.js】的下载地址:
https://wwnb.lanzoul.com/b02sez3h9a


密码:2e5h

BY丶显示 发表于 2024-9-4 00:39

感谢分享,这样可以写自定义后缀名,打开方式和浏览。

二零一八小王子 发表于 2024-8-31 21:58

nulla2011 发表于 2024-8-31 21:53
好东西,以前用过很久这软件却没想过还能写脚本

网上有极其少数的例子,但是靠自己摸索下官方文档也就是那个参考资料第一个。

另外,如果只是需要基本命令,他内置是有的,也可以下载他的一些插件,他已经放在官网了。

Anstar 发表于 2024-8-31 21:46

热心回复!

nulla2011 发表于 2024-8-31 21:53

好东西,以前用过很久这软件却没想过还能写脚本

justwz 发表于 2024-8-31 23:10

文件嵌套比较多的 就很实用

博爵 发表于 2024-8-31 23:51

还能这么用,这软件一直在使用。都是用一些基本功能

EssenceA1 发表于 2024-9-1 06:43

这个必须支持,楼主大爱

愚无尽 发表于 2024-9-1 09:12

QTTabBar确实太强了,从用上就没离开过的插件。原来还可以这么用,谢谢分享思路。

二零一八小王子 发表于 2024-9-1 11:16

愚无尽 发表于 2024-9-1 09:12
QTTabBar确实太强了,从用上就没离开过的插件。原来还可以这么用,谢谢分享思路。

嗯嗯,虽然更新很不及时,但是足够使用。无论是对于一般用户还是高级用户。用起来比win自带的资源管理器方便不少。

ThinkPC 发表于 2024-9-1 15:31

一直在用 就是不太支持win11 遗憾
页: [1] 2 3
查看完整版本: 【QTTabBar】手把手教你QTTabBar命令栏js脚本的自定义开发与实战