【问题标题】:FOR statement returning blank variable for command outputFOR 语句为命令输出返回空白变量
【发布时间】: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 KitHKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime 环境的子级安装了 JDK 和 JRE。

标签: batch-file for-loop


【解决方案1】:
for /f "tokens=4 delims= " %%j in ('java -fullversion 2^>^&1') do set InstalledVersion=%%~j
echo %InstalledVersion%

为我工作愉快。

1.8.0_73-b02

来自我的版本

java完整版“1.8.0_73-b02”

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多