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

Path 如何在Tcl中操作路径名的组件?,path,tcl,Path,Tcl,我正在编写一个报告脚本,它是便携式测试包的一部分。用户可以在系统的任何地方解压包,这很好,但这意味着我不能硬编码路径 假设在我的系统上,这个脚本位于C:/projects/testpackage/foo/bar/script.tcl。我需要设置一个变量packageLocation,即/testpackage的路径。在本例中,它将是C:/Projects/testpackage。但是,当用户获得软件包时,他或她可以将其放在任何地方,如下所示: C:/Users/whatever/testpack

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

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

C:/Users/whatever/testpackage

因此,如何从当前运行脚本的位置向上调用两个级别?在批处理中,我可以这样做

    :: example.bat
    cd %~dp0
    cd ../..
    set packageLocation=%cd%
在Tcl,我迷路了。我知道运行脚本的当前位置可以称为$::argv0。我试过使用cd../,但没有用。它尝试将packageLocation设置为“./…C:/Projects/testpackage/foo/bar/script.tcl”

感谢您的帮助。谢谢

set where [file normalize [file dirname [info script]]]
set parts [file split $where]
set pkgloc [file join {*}[lrange $parts 0 end-2]]
你应该做你想做的

事情是这样的:

  • 获取从中读取要计算的当前脚本的文件的目录名,然后对其进行规范化(替换
    ~
    等)
  • 在路径分隔符处拆分获得的完整路径名,生成路径组件列表
  • 从路径组件列表中提取一个新列表,该列表从一开始就包含除最后两个之外的所有组件,然后将它们合并回最终名称

  • 如果Tcl<8.5,则必须重写最后一行:

    set last [expr {[llength $parts] - 3}]
    set pkgloc [eval [list file join] [lrange $parts 0 $last]]
    
    你应该做你想做的

    事情是这样的:

  • 获取从中读取要计算的当前脚本的文件的目录名,然后对其进行规范化(替换
    ~
    等)
  • 在路径分隔符处拆分获得的完整路径名,生成路径组件列表
  • 从路径组件列表中提取一个新列表,该列表从一开始就包含除最后两个之外的所有组件,然后将它们合并回最终名称

  • 如果Tcl<8.5,则必须重写最后一行:

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