Board logo

标题: [系统相关] 批处理如何获取变量值里的数字 [打印本页]

作者: 56335571    时间: 2023-8-8 21:42     标题: 批处理如何获取变量值里的数字

比如用户名为:ad123bc456这样的随机数字, 如何只提取%USERNAME%里面的数字,使结果为123456.谢谢赐教
作者: TAT    时间: 2023-8-8 21:58

遍历字符串,当为0123456789之一时取出并追加
作者: Five66    时间: 2023-8-8 22:43

一个一个截取,然后比较,是数字的就合并
作者: 77七    时间: 2023-8-9 00:32

参考:
批处理提取变量中的数字
作者: aloha20200628    时间: 2023-8-9 00:45

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "pwd=ad654bc321" &set "_pwd=!pwd!"
  4. for %%n in (0,1,2,3,4,5,6,7,8,9) do set "_pwd=!_pwd:%%n=,!"
  5. for %%s in (!_pwd!) do set "pwd=!pwd:%%s=!"
  6. echo,!pwd!
  7. endlocal&exit/b
复制代码

作者: qixiaobin0715    时间: 2023-8-9 08:36

代码有bug:
如果pwd=b654bc321呢?
最直接的办法是将数字0-9均设置为类似“#单个数字=0”的变量,顺序读取每个字符,判断“#所取字符”是否被定义。
作者: hfxiang    时间: 2023-8-9 09:08

本帖最后由 hfxiang 于 2023-8-9 09:11 编辑

回复 1# 56335571
用第3方工具gawk( http://bcn.bathome.net/tool/5.1.0/gawk.exe )比较简单:
  1. echo;ad123bc456|gawk -v"RS=[0-9]+" "{printf RT}"
复制代码

作者: qixiaobin0715    时间: 2023-8-9 09:35

本帖最后由 qixiaobin0715 于 2023-8-9 09:51 编辑

如果是单独一行字符串的话:
  1. @echo off
  2. set "pwd=b123bc456"
  3. for /l %%i in (0,1,9) do set #%%i=true
  4. set n=0
  5. :o
  6. call set CH=%%pwd:~%n%,1%%
  7. if defined #%CH% set var=%var%%CH%
  8. set /a n+=1
  9. if defined CH goto :o
  10. echo,%var%
  11. pause
复制代码
上面代码,变量值中不能含有&等特殊字符,如何处理这种情况不得而知。
作者: aloha20200628    时间: 2023-8-9 10:02


订正5楼代码》改为纯P的“递归”结构应该就可以了...

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "pwd=b654bc321"
  4. :[Loop]
  5. set "_pwd=!pwd!"
  6. set "pwd_=!pwd!"
  7. for %%n in (0,1,2,3,4,5,6,7,8,9) do set "_pwd=!_pwd:%%n=,!"
  8. echo,!_pwd!
  9. for %%s in (!_pwd!) do set "pwd=!pwd:%%s=!"
  10. if "!pwd!"=="!pwd_!" (goto[end]) else (goto[Loop])
  11. :[end]
  12. echo,!pwd!
  13. endlocal&exit/b
复制代码

作者: qixiaobin0715    时间: 2023-8-9 13:22

本帖最后由 qixiaobin0715 于 2023-8-9 15:13 编辑
  1. @echo off
  2. set "pwd=0b123b=c456p;i987"
  3. setlocal enabledelayedexpansion
  4. for %%i in (%pwd%) do set var=!var!%%i
  5. set pwd1=a%var%a
  6. set pwd2=a%var%a
  7. for /l %%i in (0,1,9) do set pwd1=!pwd1:%%i= !
  8. for %%i in (%pwd1%) do (
  9.     set pwd2=1!pwd2:*%%i=!
  10.     set /a n=pwd2
  11.     set n=!n:~1!
  12.     if defined n set m=!m!!n!
  13. )
  14. if defined m (echo,%m%) else (No Numbers)
  15. pause
复制代码
代码第4-6行是对变量值进行规整;后面与5楼代码大同小异,思路基本相同。
如果含有(&<等)特殊字符则代码无效。
作者: Batcher    时间: 2023-8-9 15:04

回复 1# 56335571


    参考:http://bbs.bathome.net/thread-64867-1-1.html
作者: 77七    时间: 2023-8-9 16:30

2、3楼方法挺好的,逐个判断。
  1. @echo off
  2. for /f "useback delims=" %%a in ("%~f0") do set str=%%a
  3. setlocal enabledelayedexpansion
  4. set n=0
  5. :loop
  6. (echo=!str:~%n%,1!|findstr [0-9] && set str2=!str2!!str:~%n%,1!)1>nul 2>nul
  7. if "!str:~%n%,1!" neq "" (
  8. set /a n+=1
  9. goto :loop
  10. )
  11. echo !str!  =^>  !str2!
  12. endlocal
  13. pause
  14. exit
  15. a!@#d1$%;'":^2&*3b(c<,.>/?4_+5{}|%a%b6\
复制代码

作者: 56335571    时间: 2023-8-9 19:35

回复 4# 77七
已解决,感谢随风大神的案例
作者: jszw666    时间: 2023-8-21 12:09

向各位学习  变量 。




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