我正在尝试使用以下命令从 tcl/tk 打开一个文件夹
eval exec [auto_execok start] [list $folderpath]
它给我的语法错误是不正确的。
在我尝试
start $folderpath
打开文件夹时的 tclsh 命令提示符中。
任何帮助表示赞赏。
glenn 的解决方案不适用于包含空格的文件夹。我的解决方案是:
set dir {C:\Program Files\Microsoft Office};# example
set escaped_dir [string map {\\ \\\\} [file nativename $dir]]
eval exec [auto_execok start] explorer $escaped_dir
但我想知道如何通过默认文件管理器打开文件夹,因为我使用了替代文件管理器。
您使用的代码几乎是正确的。你想要这个:
eval exec [auto_execok start] [list "" $folderpath]
那是因为您需要在其中使用额外的空白参数start
才能使用(它是要创建的窗口的“标题”,如果您习惯于只输入相对文件名,则相当模糊)。这是一个特定的怪癖start
,结合 Tcl 如何引用通过 Windows 进程创建接口馈送的事物;发生的事情是 Tcl 将"
字符放在非简单参数周围(几乎总是正确的做法),这会导致start
混淆并做错误的事情,从而导致错误消息。这非常可怕,但是添加一个额外的空参数可以解决问题。
如果还没有,您可能还需要将该路径转换为本机格式:
eval exec [auto_execok start] [list "" [file nativename $folderpath]]
(你怎么知道它是否是原生的?检查目录分隔符是/
- Tcl 标准,在 Unix 和 OSX 上也是原生的 - 或者\
- Windows 使用的。)
在某些情况下,您可能需要file attributes $folderpath -shortname
解决问题。我希望你不需要那个!(公平地说,这些天几乎没有什么用;它只在 XP 之前的系统上很重要,尽管它在处理非常长的路径时偶尔仍然有用。)
如果您使用的是 Tcl 8.5(或更高版本),我们鼓励您使用 Glenn 提出的语法更改,因为它们更清晰、更易于使用并且速度也稍微快一些(不是最后一个在这里很重要;速度差异会与启动子流程的成本相比只是噪音):
exec {*}[auto_execok start] "" [file nativename $folderpath]
如果您使用的是 8.4(较旧,但受支持)或之前的版本(为什么!?),请使用带有eval
上述表单的表单。
如果你使用 tcl 8.5,你可以这样写:exec {*}[auto_execok start] $folderpath