2014-10-07 13 views
0

我想調試以下由TopCoder提供的啓動腳本,以啓動其用於製作UML圖的Java應用程序。解釋以下CMD腳本中的一些行以啓動Topcoder UML工具

@echo off 
setlocal 

cd /d "%~dp0" 

set CP=. 
for /r ./lib %%V IN (*.jar) DO call :pathmunge "%%V" 
call :pathmunge .\resources 
call :pathmunge .\conf 

start javaw -Xmx256m -cp %CP% com.topcoder.umltool.deploy.UMLToolDeploy %1 %2 %3 %4 

endlocal 
goto :eof 

:pathmunge 
set CP=%CP%;%1 

腳本從命令行運行時拋出錯誤。

The input line is too long. 
The syntax of the command is incorrect. 

所以,我試圖深入研究這個名爲run.cmd的腳本在做什麼。我瞭解,以javaw開頭的聲明是啓動該應用程序的聲明,該聲明還需要四個參數。我找不到這些論據來自哪裏。

另外,據我所知,FOR循環遞歸地從./lib獲取所有文件並將它們添加到Classpath。這是怎麼回事? (語法明智)

請讓我也知道我錯過了其他'精美打印'。

我希望能夠使用答案中提供的描述來解決問題的底部。

系統詳細信息:Windows 8 x64,非管理員帳戶。

回答

1

首先,通過將批處理文件的第一行更改爲@echo on,您可以在命令提示符窗口中看到該批處理文件的執行情況,如何在執行過程中逐行解釋和處理該批處理文件。

批處理文件首先將當前工作目錄設置爲批處理文件的目錄,該文件顯然是Java的目錄。

pathmunge是一個被稱爲像Java中的函數的標籤。 pathmunge下面的代碼是函數體。在此批文件中的函數pathmunge具有僅1行代碼:

set CP=%CP%;%1 

這是批量代碼等效用於附加的字符串與存儲在變量CP的環境這顯然短於類路徑另一個字符串。

CP的初始值只是.,表示當前目錄。

pathmunge的每次調用中,當前工作目錄(批處理文件的目錄)或其子目錄之一的子目錄lib中具有完整路徑的* .jar文件的名稱將附加在分號後面。

在帶有完整路徑的* .jar文件的名稱中包含1個或多個空格的情況下,文件名將附加在雙引號中。這是不正確的,因爲運行javaw.exe上的整個類路徑字符串應該用雙引號括起來,而不是每個* .jar文件。

%1 in函數pathmunge引用第一個函數參數 - 調用pathmunge時從FOR循環傳遞的* .jar文件的名稱。

取決於*的數量。jar文件在批處理文件的目錄的子目錄lib中,環境變量CP中的字符串可能會變得很長,太長而無法被cmd.exe處理,請參見Command prompt (Cmd. exe) command-line string limitation

這是你的問題。有太多的* .jar文件,它們的完整路徑附加到很長的字符串上,最後太長而無法進一步處理。

追加到類路徑目錄列表字符串也是兩個子目錄resourcesconf使用相對路徑。

使用%1 %2 %3 %4開始批處理文件時使用的前4個參數的字符串值被引用以傳遞給javaw.exe作爲參數。如果您只是雙擊批處理文件,那麼這4個變量就是空的。

@echo off 
setlocal 

cd /D "%~dp0" 

set "CP=." 
for /R .\lib %%V in (*.jar) do call :pathmunge "%%V" 
call :pathmunge .\resources 
call :pathmunge .\conf 

start "" javaw.exe -Xmx256m -cp "%CP%" com.topcoder.umltool.deploy.UMLToolDeploy %* 

endlocal 
goto :EOF 

:pathmunge 
set "CP=%CP%;%~1" 

CP,附加在雙引號完整路徑每次* .jar文件的名稱,而不是現在完成:(因爲不是由我與Java測試的最有可能的)

更好地將下面的代碼文件名不添加雙引號,而是在運行javaw.exe時將整個類路徑字符串用雙引號引起來。

並且由於%*而不是%1 %2 %3 %4,所以在啓動批處理文件時指定的所有參數現在都會傳遞到javaw.exe,因爲它們的編號不同。

它可能有助於避免在子目錄lib及其子目錄中添加相對路徑而不是完整路徑的* .jar文件。這使得類路徑字符串更短。下面的批處理代碼將* .jar文件添加爲相對路徑。

@echo off 
setlocal EnableDelayedExpansion 

set "UmlToolDirectory=%~dp0" 
cd /D "%UmlToolDirectory%" 

set "CP=." 
for /R .\lib %%V in (*.jar) do (
    set "LibraryFile=%%V" 
    set "LibraryFile=!LibraryFile:%UmlToolDirectory%=.\!" 
    call :pathmunge "!LibraryFile!" 
) 
call :pathmunge .\resources 
call :pathmunge .\conf 

start "" javaw.exe -Xmx256m -cp "%CP%" com.topcoder.umltool.deploy.UMLToolDeploy %* 

endlocal 
goto :EOF 

:pathmunge 
set "CP=%CP%;%~1" 

如果您想了解更多有關這些命令中的一個,打開命令提示符窗口,通過參數/?運行命令狀

call /? 
cd /? 
for /? 
goto /? 
set /? 
setlocal /? 
start /? 
相關問題