1

我正在尝试使用以下命令从 tcl/tk 打开一个文件夹

eval exec [auto_execok start] [list $folderpath]

它给我的语法错误是不正确的。

在我尝试 start $folderpath打开文件夹时的 tclsh 命令提示符中。

任何帮助表示赞赏。

4

3 回答 3

1

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

但我想知道如何通过默认文件管理器打开文件夹,因为我使用了替代文件管理器。

于 2012-09-06T09:53:38.560 回答
1

您使用的代码几乎是正确的。你想要这个:

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上述表单的表单。

于 2012-09-06T10:13:24.860 回答
0

如果你使用 tcl 8.5,你可以这样写:exec {*}[auto_execok start] $folderpath

于 2012-09-05T11:52:54.410 回答