如何在Tcl中操作路径名的组件?

时间:2013-08-01 15:38:59

标签: path tcl

我正在编写一个报告脚本,它是便携式测试包的一部分。用户可以在他们的系统上的任何地方解压缩包,这很好,但这意味着我无法对路径进行硬编码。

让我们说在我的系统上,这个脚本位于C:/projects/testpackage/foo/bar/script.tcl。我需要设置一个变量packageLocation,即/ testpackage的路径。在这个例子中,它将是C:/ Projects / testpackage。但是当用户获得包裹时,他或她可以将它放在任何地方,如:

C:/用户/不管/ testpackage

那么,如何从我当前运行的脚本的位置调用两个级别?在批处理中,我可以做到

    :: example.bat
    cd %~dp0
    cd ../..
    set packageLocation=%cd%

在Tcl,我迷路了。我知道正在运行的脚本的当前位置可以称为$ :: argv0。我尝试过使用cd .. / ..但无济于事。它尝试将packageLocation设置为“../ .. C:/Projects/testpackage/foo/bar/script.tcl。”

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

set where [file normalize [file dirname [info script]]]
set parts [file split $where]
set pkgloc [file join {*}[lrange $parts 0 end-2]]

应该做你想做的事。

它是这样的:

  1. 获取要从中读取当前脚本的文件的目录名称,然后对其进行标准化(替换~..等。)
  2. Splits在路径分隔符处获取完整路径名,生成路径组件列表。
  3. 从最开始的两个路径组件的路径组件列表中提取一个新列表,然后将它们连接起来以生成最终名称。

  4. 如果你有Tcl< 8.5,最后一行必须重写:

    set last [expr {[llength $parts] - 3}]
    set pkgloc [eval [list file join] [lrange $parts 0 $last]]