Как получить версию Java в подпрограмме пакетного скрипта? - PullRequest
0 голосов
/ 02 июня 2018

С этот вопрос :

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

Как я могу поместить это в подпрограмму и вызвать ее, передавая путь к исполняемому файлу Java?Вот пример моей проблемы:

@echo off
setlocal enabledelayedexpansion

call :GET_JAVA_VER "java"
goto END

:GET_JAVA_VER
    for /f "tokens=3" %%g in ('%1 -version 2^>^&1 ^| findstr /i "version"') do @echo %%g
    %1 -version 2>&1 | findstr /i "version"
goto :EOF

:END
    endlocal

Это выводит:

The filename, directory name, or volume label syntax is incorrect.
java version "10.0.1" 2018-04-17

Мне кажется, что цикл for оценивает параметр (%1) по-разному.

В чем разница?


РЕДАКТИРОВАТЬ

Возможный дубликат Java-версии в пакетном файле

Согласно этому ответу , если это действительно проблема, мне придется каким-то образом преобразовывать переданный путь, добавляя кавычки вокруг каждого каталога, содержащего пробелы.Это звучит как боль, и я надеюсь, что есть другое объяснение;Я до сих пор не понимаю, почему в этом случае просто передать «java» не работает.

(Примечание: использование usebackq и обратных кавычек не имеет значения)

1 Ответ

0 голосов
/ 02 июня 2018

Кажется, что передача вывода в findstr по какой-то причине отбрасывала кавычки.Я сделал вывод, потому что когда я удалил часть ^| findstr /i "version", это:

@echo off
setlocal enabledelayedexpansion

call :GET_JAVA_VER "java"
goto END

:GET_JAVA_VER
    for /f "tokens=3" %%g in ('%1 -version 2^>^&1') do @echo %%g
goto :EOF

:END
    endlocal

Выводит это:

"10.0.1"
Runtime
64-Bit

Этот модифицированный скрипт работает (также с полными путями):

@echo off
setlocal enabledelayedexpansion

call:GET_JAVA_VER "java"
goto END

:GET_JAVA_VER
    for /f "tokens=3" %%g in ('%~1 -version 2^>^&1') do (
        echo %%~g
        rem Stop after first line
        goto :EOF
    )
goto :EOF

:END
    endlocal
...