Batch file FOR语句返回命令输出的空白变量
下面代码中的第三个FOR语句应该从“java full version”1.8.0_66-b18”的命令输出返回“18066”,但返回为空,这导致后面的比较失败。有人能帮忙吗Batch file FOR语句返回命令输出的空白变量,batch-file,for-loop,Batch File,For Loop,下面代码中的第三个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^" %
@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
谢谢你的答复
注意:我从用户Npcmaka那里借用了一些代码
-编辑-
我仍然不知道为什么原始代码不起作用,但我找到了一个解决方案,使我的脚本起作用。我没有将JavaHome添加到系统路径以便脚本可以找到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
为我工作很愉快
1.8.0_73-b02
从我的版本
java完整版本“1.8.0_73-b02”
为我工作很愉快
1.8.0_73-b02
从我的版本
java完整版本“1.8.0_73-b02”
您是否剪切并粘贴了代码,或者重新键入了代码?批处理有时对空格敏感,例如在
=
两侧的set
语句中。当独立运行时,java
查询返回控制台的是什么?/f的活动代码线^^j、
为我工作得很愉快,适当地设置了installedversion
。此外,由于循环参数区分大小写,使用起来更安全,从%%G
开始,而不是%%G
,实际上您使用%%a
可能是一个错误,尝试不同的字符。我会尝试不同的字符,但这对我来说是新闻,大写字符是首选。这是第三个适合我的for循环,使用%%j%%k%%l%%m.Magoo,我也会尝试重新键入它。我记不起我是否粘贴了它,但第三个for循环是第一个for循环的一个轻微变化,第一个for循环没有问题。奇怪的是,它对您有效。如果InstalledVersion
为空,则表示java不在路径中。这意味着JavaHome
不包含java.exe
。我将使用另一个注册表路径。HKEY\U LOCAL\U MACHINE\SOFTWARE\JavaSoft\Java开发工具包
或HKEY\U LOCAL\U MACHINE\SOFTWARE\JavaSoft\Java Runtime
环境的子环境安装了JDK和JRE。您是否剪切和粘贴了代码,或者重新键入了代码?批处理有时对空格敏感,例如在=
两侧的set
语句中。当独立运行时,java
查询返回控制台的是什么?/f的活动代码线^^j、
为我工作得很愉快,适当地设置了installedversion
。此外,由于循环参数区分大小写,使用起来更安全,从%%G
开始,而不是%%G
,实际上您使用%%a
可能是一个错误,尝试不同的字符。我会尝试不同的字符,但这对我来说是新闻,大写字符是首选。这是第三个适合我的for循环,使用%%j%%k%%l%%m.Magoo,我也会尝试重新键入它。我记不起我是否粘贴了它,但第三个for循环是第一个for循环的一个轻微变化,第一个for循环没有问题。奇怪的是,它对您有效。如果InstalledVersion
为空,则表示java不在路径中。这意味着JavaHome
不包含java.exe
。我将使用另一个注册表路径。HKEY\u LOCAL\u MACHINE\SOFTWARE\JavaSoft\Java开发工具包
或HKEY\u LOCAL\u MACHINE\SOFTWARE\JavaSoft\Java运行时
环境的子环境安装了jdk和jre。
for /f "tokens=4 delims= " %%j in ('java -fullversion 2^>^&1') do set InstalledVersion=%%~j
echo %InstalledVersion%