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
)。
有什么区别?
修改
可能重复根据this answer,如果这确实是问题,我将不得不以某种方式通过在包含空格的每个目录周围添加引号来转换传入的路径。这听起来很痛苦,我希望有另一种解释;我仍然不知道为什么在这种情况下只是传入" java"不起作用。
(注意:使用usebackq
和后引号没有区别)
答案 0 :(得分:0)
似乎将输出汇总到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