Windows Batch - 更新IF循环中的变量

时间:2017-06-23 16:50:32

标签: windows batch-file cmd

我想弄清楚用户计算机上安装了哪个版本的软件。版本是5.0,4.0,3.0。版本 5.0是最新的

  • 我想检查用户是否按此顺序安装了这些版本。
  • 我写了一个脚本如下:我还在顶部添加了setlocal enabledelayexpansion
  • 我在这里(在stackoverlow上)学到了我需要使用!variable!来改变IF循环中变量VERSION的值。
  • 我自己尝试过,但大多数例子都是为了回声。
  • 我在这里更改版本的值。
  • 然后更新路径目录。

我无法完成这项工作。你能帮忙吗?非常感谢你。

这是我的剧本:

:: Find the version installed in the user's computer
:: valid versions are 5.0, 4.0, 3.0 

setlocal enabledelayedexpansion
ECHO OFF
SET "error_code=0"

::  Latest Software version
    SET VERSION=5.0
    echo checking SOFTWARE Version: %VERSION%

::  build a path and check if it exists

SET "PATH=%PROGRAMFILES%\MYSOFT\%VERSION%"
call:CHECK_IF_VALID "%PATH%"

if %error_code% == 1 (

::  check v.4    
    SET VERSION=4.0
    echo checking SOFTWARE Version: !VERSION!
    SET "PATH=%PROGRAMFILES%\MYSOFT\%VERSION%"
    call:CHECK_IF_VALID "%PATH%"

    if %error_code% == 1 (

    ::  check v.3 
        SET VERSION=3.0
        echo checking SOFTWARE Version: !VERSION!
        SET "PATH=%PROGRAMFILES%\MYSOFT\%VERSION%"
        call:CHECK_IF_VALID "%PATH%"

        if %error_code% == 1 (          
            echo.&pause&goto:eof
        )
    )
)

::  Function to check if path exists    
    :CHECK_IF_VALID

    if not exist %1 (
       echo version not found...
       set "error_code=1"
     ) else echo. Version found...       
     echo.

goto:eof
EXIT    

2 个答案:

答案 0 :(得分:1)

path指的是Windows在目录中找不到的可执行文件时搜索的路径序列。改变它不是一个好主意。一点也不好。

::是一个损坏的标签,并且(括号中的命令序列)或code blocks不允许使用标签 - 而是使用rem

每当您需要访问该代码块中!var!的修改值时,您需要在code block内使用var%var%访问var原始值(遇到代码块时)

因此,

set "versionfound="
for %%v in (5.0 4.0 3.0) do if not defined versionfound (
 if exist "%PROGRAMFILES%\MYSOFT\%%v" set "versionfound=%%v"
)
if defined versionfound (echo %versionfound% found) else (echo not found)

应检测版本。它依次将三种可能性替换为字符串,并检测该版本是否存在。如果是,则将versionfound设置为找到的版本(已初始化为 nothing ),然后跳过检查,因为if defined使用当前值环境(未设置值集或值)。

答案 1 :(得分:0)

也许更简单:

使用所有版本创建list,并在测试loop的所有版本上创建path

@echo off
set "$version=3.0 4.0 5.0"
SET "$PATH=%PROGRAMFILES%\MYSOFT\"

::Checking if a version is installed

for %%a in (%$version%) do (
    echo Checking Version : %%a
    if exist "%$PATH%%%a" (
        echo VERSION IS : %%a
        goto:eof
    )
)

echo No version Found !!

如果可以在同一台机器上安装各种版本,那么我们最后一个:

@echo off
set "$version=3.0 4.0 5.0"
SET "$PATH=%PROGRAMFILES%\MYSOFT\"
set "$LastVersion=none"

setlocal enabledelayedexpansion

::Checking if a version is installed

for %%a in (%$version%) do (
    echo Checking Version : %%a
    if exist "%$PATH%%%a" (
        echo VERSION %%a is installed
        set $LastVersion=%%a
    )
)

Echo Last Version Installed : !$LastVersion!