2011-04-15 100 views
10

我想獲得 '6' 如下如何從批處理腳本獲取Java版本?

java version "1.6.0_21" 
Java(TM) SE Runtime Environment (build 1.6.0_21-b07) 
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing) 

給出了相同的Java版本輸出我寫這個批處理腳本

set VERSION6="1.6.0_21" 
java -version 2>&1 | findstr "version" >ab.txt 
for /f "tokens=3" %%g in (ab.txt) do (
    if not %%g == %VERSION6% echo %%g 
    echo %%g 
) 

%%g顯示 「1.6.0_21」

有人可能指導我改正方向嗎?我對for /f不太瞭解。

回答

9
@echo off 
setlocal 

set VERSION6="1.6.0_21" 
for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do (
    @echo Output: %%g 
    set JAVAVER=%%g 
) 
set JAVAVER=%JAVAVER:"=% 
@echo Output: %JAVAVER% 

for /f "delims=. tokens=1-3" %%v in ("%JAVAVER%") do (
    @echo Major: %%v 
    @echo Minor: %%w 
    @echo Build: %%x 
) 

endlocal 

在第一for循環,"tokens=3"說,我們將只使用第三代幣從命令的輸出。 java -version命令的輸出不是重定向到一個文件,而是我們可以在for循環內運行這個命令。插入符號(^)是轉義字符,因此我們可以在命令字符串中嵌入>,&|符號。

for循環體內,我們設置了一個新的變量JAVAVER,以便我們稍後可以對版本字符串進行一些操作。

set JAVAVER=%JAVAVER:"=%命令從版本字符串中刪除雙引號。

最後for循環解析java版本字符串。 delims=.表示我們將使用句點劃分令牌。 tokens=1-3表示我們要將前三個令牌從字符串傳遞到循環體。我們現在可以使用顯式變量%%v和隱含變量(字母表中的下一個字母)%%w%%x來獲取java版本字符串的組件。

當我在我的系統上運行此我得到:

Output: "1.6.0_24" 
Output: 1.6.0_24 
Major: 1 
Minor: 6 
Build: 0_24 
+0

感謝帕特里克,這真的很酷的東西。希望我有一天會寫我自己的,但是這對於/ f對我來說是相當困惑的:( – abi1964 2011-04-15 12:08:50

+0

還有一件事我需要問與上述問題有關。如果我的JAVA_HOME路徑設置爲「c:\ Program Files \ ....「,當我運行該腳本時,它會得到一個空格,並說」'C:\ Program'不能識別爲內部或外部命令,可操作程序或批處理文件。「我該如何解決這個問題? – abi1964 2011-04-19 09:55:05

+1

@Abhishek,嘗試在'%JAVA_HOME%'周圍放置雙引號,就像這樣:'「%JAVA_HOME%」'。 – 2011-04-19 14:49:29

1

這將提取的版本號的次要部分:

java -version 2>&1 | awk '/version/ {print $3}' | awk -F . '{print $2}' 

但是,它可能是更好的提取上,在案件甲骨文以後再例如更改版本號方案MAJOR.MINOR搭配:

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+' 
+0

嘿,謝謝歐文。 awk在windows上無法運行,我在linux中使用了相同的命令,但你的程序似乎更好,這裏是我的java -version 2>&1 |頭-1 | awk'{print $ NF}'|切「-d」。 -f2 – abi1964 2011-04-15 11:08:34

+0

啊,我的不好。對不起,我沒有仔細閱讀,發現它是Windows。 – 2011-04-15 11:12:00

+0

沒關係,看來我需要15點聲望才能投票。我是這個網站的新手,當我在這個網站上有足夠的聲望時會這樣做。再次感謝! – abi1964 2011-04-15 11:16:50

0
for /f tokens^=2-5^ delims^=.-_^" %j in ('java -fullversion 2^>^&1') do @set "jver=%j%k%l%m" 

這將Java版本存儲到jver變量和整數 你也可以用它來比較.EG

if %jver% LSS 16000 echo not supported version 

。您可以通過刪除%k和%l和%m來使用更多主要版本。此命令提示版本。

對於。蝙蝠使用這樣的:

@echo off 
PATH %PATH%;%JAVA_HOME%\bin\ 
for /f tokens^=2-5^ delims^=.-_^" %%j in ('java -fullversion 2^>^&1') do set "jver=%%j%%k%%l%%m" 

根據我的測試,這是擺脫蝙蝠的Java版本(因爲它僅使用內部命令,而不是外部因素爲FINDFINDSTR並且不使用GOTO最快的方法,其也可以減緩劇本)。一些JDK供應商不支持-fullversion交換機,或者它們的實現與Oracle提供的不一樣(更好地避免它們)。