【求助】Everything 調用 Total Commander 無法開啟含特殊符號的路徑

需求

我希望 Everything 的打开文件/目录功能不使用默认的资源管理器打开,改成使用 TC。

我的方案

我在 Everything 的“工具” → “选项” → “上下文菜单” → “打开(文件夹)”中,将命令从 $exec("%1") 改成如下:

$exec("D:\software\TotalCMD_64bit_11.03\TOTALCMD64.exe" /O /T /P=L /L="%1")

遇到的问题

  1. 常规路径(如 D:\tmp\test)可以正常打开。
  2. 特殊路径(如 D:\tmp\test♪)失效。点击后 TC 虽然启动/激活了,但无法正确跳转。

我的验证

我在 cmd 中分别尝试了下面两条命令,发现前者可以正常工作,后者不行:

"D:\software\TotalCMD_64bit_11.03\TOTALCMD64.EXE" /O /T /P=L /L="D:\tmp\test"
"D:\software\TotalCMD_64bit_11.03\TOTALCMD64.EXE" /O /T /P=L /L="D:\tmp\test♪"

后者无法无法正确执行,这证明了和 Everything 没有关系。

诉求

似乎是 TC 本身的 BUG 或者 cmd 的环境编码问题。请问如何修改上述 $exec 命令或者有其他曲线救国的方案?

问题并不是出在参数传输过程,将命令改成

$exec(cmd /k echo "%1")

可以看到含的路径正确地传输了过去

而且将命令换成 Directoy Opus 和 Q-Dir 的主程序exe都能正确打开

你好,感谢回复。

$exec(cmd /k echo "%1") 只能证明 Everything 确实把字节传出去了,数据本身没有丢失。

我怀疑是接收端的解析能力的问题 —— Everything 确实把数据传出来了,但是 TC “接不住”。TC 的命令行开关(/L=…)的解析逻辑应该是有 BUG 的。

命令 "D:\software\TotalCMD_64bit_11.03\TOTALCMD64.EXE" /O /T /P=L /L="D:\tmp\test♪" 没有正常运行,就能证明是 TC 或者是 cmd 环境的锅。

那么问题来了,这又该怎么解决呢?

试试

open_folder_command2=$exec("D:\software\TotalCMD_64bit_11.03\TOTALCMD64.EXE" /O "/R=%1" /T)
open_path_command2=$exec("D:\software\TotalCMD_64bit_11.03\TOTALCMD64.EXE" /O "/R=$parent(%1)" /T)


1 个赞

用8.3文件名,tc能正确处理。
至于怎么让everything传递8.3文件名,据说是$s,不保真,可以查everything帮助文档确认

测试发现好像确实是TC的一个bug,同样是文件夹,只不过末尾加个 就行为不一致了。
解决方法:使用8.3文件名
新建一个a.bat

@echo off
:: 把长路径转成 8.3 短路径
set "ShortPath=%~fs1"

:: 去掉可能残留的双引号(保险起见)
set "ShortPath=%ShortPath:"=%"

:: 调用 Total Commander,用短路径作左面板目标
"D:\YourPath\Totalcmd64.exe" /O /S /L="%ShortPath%"

然后设置everything的命令是

$exec("a.bat" "%1")

我想可能可以用一行命令用for来把%1扩展到8.3文件名的,不过尝试了全都失败了。

我给的方案 是可以的, 也不用改8.3

1 个赞

测试发现/L=%1就不行,/R=%1就可以。加不加引号,在%1上或者/R=%1上加引号都不影响。
显然是TC一个bug

引号是解决更特殊情况用的.

L也有特殊限制,所有用R.

在自己本机1156 32&64 ev1.4.1026上,用楼主参数毫无问题。甚至我还改了不少unicode符号也都OK。

也下了老版本1103测试,也是正常的。

建议修改上下文菜单里面的 打开路径 而不是打开文件夹,这样你在右边路径栏双击或者快捷键Ctrl+Enter就可以用TC打开。

$exec(“..\..\totalcmd.exe” /O /T /A /P /S /L=“%1”)

路径替换为自己的绝对路径,我更喜欢ev放在TC里面便携,所以这样设置。

试用了一天,R 和我的使用习惯相悖,很不舒服。请问有其他方法吗?

你可以改成L 试试.

这是我10年+ 使用习惯和经验得出的 放右边.

具体原因忘记了, 好像用L有些缺陷.

我有个类似的需求,将TC当前操作标签页的路径动态同步到Windows资源管理器的【快速访问】区域,也就是说我在资源管理器中点击快速访问下面那个被动态更新后的快捷方式能跳转到TC当前打开的路径(是在资源管理器中打开tc的路径,而不是在TC中打开),不知道能不能实现。