2017-01-19 41 views
0

我想通過tcl腳本在svn中提交一個文件。我在TCL腳本當試圖使用SVN命令提交文件時,TCL腳本發生錯誤

catch {exec svn commit -m'SDR' 'C:\abc\def\a.txt'} results 

運行以下命令,這是返回以下錯誤

svn: E020024: Error resolving case of 'C:\abc\def\a.txt' 

我已經嘗試了一切,我可以。在這裏發佈,希望能夠得到解決。提前致謝。

回答

0

使用文件加入命令可以解決我的機器上的問題:

catch {exec svn commit -m'SDR' [file join C:\\ abc def a.txt]} results 
+1

您可能想要完全刪除'''字符;在使用Tcl進行編程時,它們並不意味着什麼。 –

2

的問題是,'字符意味着什麼都沒有給TCL,不像外殼你更習慣使用。幸運的是,通過將這些值(不包含'字符)放入Tcl變量並僅使用它們,通常可以解決這個問題。在形式上,Tcl使用{ ... }其中shell使用' ... ',但任何使右字符串在實踐中都可以使用。

此外,Tcl非常熱衷於將\轉換爲/的文件名;我們也需要在那裏小心一點,因爲我們將文件名移交給一個子進程(並且file nativename正好是我們需要的護理)。

# I'm going to factor these two out into variables; that sort of thing that makes sense 
set message "SDR" 
set file [file join C:/ abc def a.txt] 

catch {exec svn commit -m $message [file nativename $file]} results 

當然,在實踐中,許多應用程序有一個工作區的概念,他們這樣做內的文件操作。它可能是當前的工作目錄,它可能在其他地方(它實際上取決於應用程序),但通常最好將它的名稱放在它自己的變量中。然後你就可以在該範圍內更容易使用的名稱:

set workingArea [file join C:/ abc] 

set message "SDR" 
set file [file join $workingArea def/a.txt] 

catch {exec svn commit -m $message [file nativename $file]} results 

,我會實際上在程序包一些是,如果它是我自己的代碼(這使用lmap,這是在Tcl的介紹8.6):

proc svnCommit {message args} { 
    global workingArea 
    set code [catch { 
     exec svn commit -m $message {*}[lmap f $args { 
      file nativename [file join $workingArea $f] 
     }] 
    } results] 
    return [list $code $results] 
} 

lassign [svnCommit "SDR" def/a.txt] code results