Board logo

标题: [其他] 两次choice,第2次无法正常获取errorlevel的值? [打印本页]

作者: wkl17    时间: 2020-2-16 23:01     标题: 两次choice,第2次无法正常获取errorlevel的值?

不知道是否bug,我在同一个bat里面,

用到2次choice选择,

但第2次的errorlevel获取的值始终有问题。

Win10 Pro 1507。

例如:
  1. @echo off
  2. :Start
  3. echo.
  4. choice /c 1234569 /M 请输入数字:
  5. echo.
  6. if errorlevel 9 set Number1=9 & goto Next
  7. if errorlevel 8 set Number1=8 & goto Next
  8. if errorlevel 7 set Number1=7 & goto Next
  9. if errorlevel 6 set Number1=6 & goto Next
  10. if errorlevel 5 set Number1=5 & goto Next
  11. if errorlevel 4 set Number1=4 & goto Next
  12. if errorlevel 3 set Number1=3 & goto Next
  13. if errorlevel 2 set Number1=2 & goto Next
  14. if errorlevel 1 set Number1=1 & goto Next
  15. :Next
  16. choice /c 1234569 /M 请输入数字2:
  17. if errorlevel 9 set Number2=99 & goto Next2
  18. if errorlevel 8 set Number2=88 & goto Next2
  19. if errorlevel 7 set Number2=77 & goto Next2
  20. if errorlevel 6 set Number2=66 & goto Next2
  21. if errorlevel 5 set Number2=55 & goto Next2
  22. if errorlevel 4 set Number2=44 & goto Next2
  23. if errorlevel 3 set Number2=33 & goto Next2
  24. if errorlevel 2 set Number2=22 & goto Next2
  25. if errorlevel 1 set Number2=11 & goto Next2
  26. :Next2
  27. echo Number1是:%Number1%
  28. echo.
  29. echo Number2是:%Number2%
  30. echo =========================
  31. goto Start
复制代码
请看我截图的测试。第2次的choice输入9后,本来应该显示99的,但却显示77
作者: wkl17    时间: 2020-2-16 23:03

虽然我choice的 /c 设置的是 1234569 ,但if errorlevel 必须从987654321这样倒序下来。如果使用9654321的话,会导致判断出错。我也不知道为什么。

但现在因为我需要的情况比较特殊, /c的值不能有7和8(举例。实际上有时只有1239这4个。)
作者: zaqmlp    时间: 2020-2-16 23:40

choice按位置而不是字符
作者: red2020    时间: 2020-2-17 00:20

本帖最后由 red2020 于 2020-2-17 00:23 编辑
  1. @echo off
  2. :Start
  3. echo.
  4. choice /c 1234569 /M 请输入数字:
  5. set/a "Number1=((%errorlevel%+1)>>3)*2+%errorlevel%"
  6. choice /c 1234569 /M 请输入数字2:
  7. set/a "Number2=(((%errorlevel%+1)>>3)*2+%errorlevel%)*11"
  8. echo;Number1是:%Number1%
  9. echo;Number2是:%Number2%
  10. echo =========================
  11. goto Start
复制代码

作者: wkl17    时间: 2020-2-17 17:03

choice按位置而不是字符
zaqmlp 发表于 2020-2-16 23:40



    原来如此,感谢解答!不知道 choice的选项,能否数字+字母组合?例如  /c 123456789AaBb  (假设要用到这些)。假设可以,不知道 顺序上要怎么列?字母是不是比数字要放在更前面?
(只是提出这样一个问题。我自己将会进行测试检验。)
作者: wkl17    时间: 2020-2-17 17:05

red2020 发表于 2020-2-17 00:20



    感谢解答,一个很酷的思路,学习了。
作者: dos-a    时间: 2023-2-13 20:12

你或许可以看看这个?里面也有不同得用法

@echo off
:1
cls
call :devices
call :de

:de
set devices=
set cat=
set cat_n=
setlocal enabledelayedexpansion
for /f "skip=1 tokens=1 delims=        " %%i in ('adb devices') do (
    set devices=!devices! %%i
    set /a cat+=1
)
for /l %%i in (1,1,%cat%) do set cat_n=!cat_n!%%i
@REM set cat_n=%cat_n%0
@REM choice /c %cat_n% /n /m 请输入" [ ] "内数字序号,按" 0 "退出当前操作:
@REM set /a e=%cat%+1
@REM if "%ERRORLEVEL%"=="%e%" call :1

set cat_n=%cat_n%ye
choice /c %cat_n% /n /m 请输入" [ ] "内数字序号,按" y "刷新设备列表,按" e "退出当前操作:
set /a y=%cat%+1
set /a e=%cat%+2
if "%ERRORLEVEL%"=="%y%" call :1
if "%ERRORLEVEL%"=="%e%" exit


for /f "tokens=%ERRORLEVEL%" %%b in ("!devices!") do set devices=%%b
pause
for /f "delims=" %%r in ('adb -s !devices! shell getprop ro.product.model') do set model=%%r
echo model=!model!
pause

call :1

:devices

setlocal enabledelayedexpansion

rem  输出所有设备标识
echo                                              ╔═             ═╗
echo                                           已连接设备
echo    ╔════════════════════════════════  ╚═             ═╝  ═════════════════════════════╗
echo,
set "cnt=0"
for /f "skip=1 tokens=1 delims=        " %%a in ('adb devices') do (
    REM 获取设备model号
    for /f "delims=" %%r in ('adb -s %%a shell getprop ro.product.model') do (
        for /f "delims=" %%x in ("%%r") do (
            set "f=%%x"
        )
    )
    set "cv="
    for /f "delims=" %%c in ('adb -s %%a shell getprop hw_sc.build.platform.version') do (
        for /f "delims=" %%x in ("%%c") do (
            set "cv=%%x"
        )
    )
    if "!cv!"=="" (
        REM 安卓
        for /f "delims=" %%s in ('adb -s %%a shell getprop ro.build.version.release') do (
            for /f "delims=" %%x in ("%%s") do (
                set "sv=%%x"
            )
        )
        set "version=!sv!"
        set "system=andorid"
    ) else (
        REM 鸿蒙
        set "version=!cv!"
        set "system=鸿蒙"
    )
    set /a cnt+=1
echo      [!cnt!] 系统版本: !system! !version!            model: !f!        序列号: %%a
echo,
)
echo    ╚══════════════════════════════════════════════════════════════════════════════════╝
echo.
goto :eof




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2