batch-file - 如何在批处理脚本子例程中获取 Java 版本?
问题描述
从这个问题:
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
和反引号没有区别)
解决方案
似乎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
推荐阅读
- c++ - 对用户制作对象的向量进行排序(带类)
- c++ - 运算符函数调用机制
- javascript - Javascript对象在分配之前获取值
- gdb - GDB 一个移动自己的 PIE
- javascript - 在 React 中提交表单时将对象添加到数组
- python - 一组子图的常见图例
- asp.net-mvc - 使用.net mvc核心中的ajax从控制器获取对象以查看
- ios - 尝试对 iOS 进行调整,以在设备摇晃时截取屏幕截图
- flutter - 从单独的 Dart 文件中导入 Flutter 小部件会贵得多吗?
- tableau-api - Tableau 使用 excel 作为数据源