2013-08-01 12 views
0

我正在編寫一個報告腳本,它是便攜式測試包的一部分。用戶可以在系統中的任何地方解壓縮包,這很好,但這意味着我無法對路徑進行硬編碼。如何操作Tcl中路徑名的組件?

假設在我的系統上,這個腳本位於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」。

任何幫助表示讚賞。謝謝!

回答

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. 拆分獲得路徑分隔符的完整路徑名,生成路徑組件列表。
  3. 從路徑組件的列表中提取一個新列表,其中包含除最後兩個之外的所有路徑組件,然後將它們連接回來以生成最終名稱。

如果擁有Tcl < 8.5,最後一行將要被改寫:

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