Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file FOR语句返回命令输出的空白变量_Batch File_For Loop - Fatal编程技术网

Batch file FOR语句返回命令输出的空白变量

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^" %

下面代码中的第三个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
谢谢你的答复

注意:我从用户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%