0

ポータブル テスト パッケージの一部であるレポート スクリプトを作成しています。ユーザーはシステムのどこにでもパッケージを解凍できますが、これは問題ありませんが、パスをハードコーディングできないことを意味します。

私のシステムでは、このスクリプトが C:/projects/testpackage/foo/bar/script.tcl にあるとしましょう。/testpackage へのパスである変数 packageLocation を設定する必要があります。この例では、C:/Projects/testpackage になります。しかし、ユーザーがパッケージを取得すると、次のようにどこにでも置くことができます。

C:/Users/whatever/testpackage.

では、現在実行中のスクリプトの場所から 2 つ上のレベルを呼び出すにはどうすればよいでしょうか? バッチでは、私はできる

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

Tclでは、私は迷っています。実行中のスクリプトの現在の場所を $::argv0 として呼び出すことができることを知っています。cd ../.. を使用してみましたが、役に立ちませんでした。packageLocation を「../..C:/Projects/testpackage/foo/bar/script.tcl」として設定しようとします。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4
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. 最後の 2 つを除く最初からすべてを含むパス コンポーネントのリストから新しいリストを抽出し、それらを再び結合して最終的な名前を生成します。

Tcl < 8.5 の場合、最後の行を書き直す必要があります。

set last [expr {[llength $parts] - 3}]
set pkgloc [eval [list file join] [lrange $parts 0 $last]]
于 2013-08-01T16:49:41.953 に答える