【发布时间】:2016-05-21 21:45:04
【问题描述】:
下面代码中的第三个 FOR 语句应该从 'java full version "1.8.0_66-b18" 的命令输出中返回 '18066',但它返回的是空白,这导致随后的比较失败。谁能提供一些帮助?
@echo off
set MSIFileName=jre1.8.0_66.msi
set KeyName="HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\javaws.exe"
for /f tokens^=2-5^ delims^=e._m^" %%a in ("%MSIFilename%") do set VersionToInstall=%%a%%b%%c%%d
for /f "tokens=2*" %%h in ('reg query %KeyName% /v Path') do set JavaHome=%%i
PATH "%PATH%;%JavaHome%"
for /f tokens^=2-5^ delims^=.-_^" %%j in ('java -fullversion 2^>^&1') do set InstalledVersion=%%j%%k%%l%%m
if "%InstalledVersion%."=="." goto INSTALL
if "%InstalledVersion%" GEQ "%VersionToInstall%" goto END
TIA 回复。
注意:我从用户 npocmaka 那里借用了一些代码,发现 here。
-编辑-
对于原始代码为何不起作用,我仍然没有答案,但我找到了使我的脚本正常工作的解决方法。我没有将 JavaHome 添加到系统 PATH 以便脚本可以找到 java.exe,而是使用了“cd”。希望这对其他人有帮助,这是更新的代码...
@echo off
set MSIFileName=jre1.8.0_66.msi
set KeyName="HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\javaws.exe"
set JavaHome=0
set IsNumber=0
for /f tokens^=2-5^ delims^=e._^" %%a in ("%MSIFilename%") do set VersionToInstall=%%a%%b%%c%%d
for /f "tokens=2*" %%e in ('reg query %KeyName% /v Path') do set JavaHome="%%f"
if %JavaHome% EQU 0 goto INSTALL
cd %JavaHome%
for /f tokens^=2-5^ delims^=._-^" %%g in ('java -fullversion 2^>^&1') do set InstalledVersion=%%g%%h%%i%%j
for /f "tokens=* delims=0123456789" %%k in ("%InstalledVersion%") do (
if "[%%k]" EQU "[]" set IsNumber=1
)
if %IsNumber% EQU 0 goto INSTALL
if "%InstalledVersion%" GEQ "%VersionToInstall%" goto END
【问题讨论】:
-
您是剪切粘贴代码还是重新输入?批处理有时对空格很敏感,例如在
=的both 两侧的set语句中。java查询在独立运行时返回到控制台是什么?活动代码行for /f ... ^^j...为我工作愉快,适当地设置了installedversion。 -
另外,for循环参数区分大小写,使用起来更安全,从
%%G开始而不是%%g,实际上你使用%%a可能是一个错误,尝试不同的字符. -
我会尝试不同的字符,但对我来说,大写字符是首选。这是第三个让我适应的 for 循环,使用 %%j%%k%%l%%m 的循环。
-
Magoo,我也试试重新输入。我不记得我是否粘贴了它,但第三个 for 循环与第一个循环略有不同,第一个工作没有问题。奇怪的是它对你有用。
-
如果
InstalledVersion为空,则表示java不在PATH中。这意味着JavaHome不包含java.exe。我会改用另一个注册表路径。HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit或HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime环境的子级安装了 JDK 和 JRE。
标签: batch-file for-loop