找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25896|回复: 13

[系统相关] 批处理如何获取变量值里的数字

[复制链接]
发表于 2023-8-8 21:42:09 | 显示全部楼层 |阅读模式
比如用户名为:ad123bc456这样的随机数字, 如何只提取%USERNAME%里面的数字,使结果为123456.谢谢赐教
发表于 2023-8-8 21:58:02 | 显示全部楼层
遍历字符串,当为0123456789之一时取出并追加
发表于 2023-8-8 22:43:52 | 显示全部楼层
一个一个截取,然后比较,是数字的就合并
发表于 2023-8-9 00:32:08 | 显示全部楼层
发表于 2023-8-9 00:45:57 | 显示全部楼层

  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
复制代码

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-8-9 08:36:21 | 显示全部楼层
代码有bug:
如果pwd=b654bc321呢?
最直接的办法是将数字0-9均设置为类似“#单个数字=0”的变量,顺序读取每个字符,判断“#所取字符”是否被定义。
发表于 2023-8-9 09:08:15 | 显示全部楼层
本帖最后由 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}"
复制代码
发表于 2023-8-9 09:35:38 | 显示全部楼层
本帖最后由 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
复制代码
上面代码,变量值中不能含有&等特殊字符,如何处理这种情况不得而知。
发表于 2023-8-9 10:02:15 | 显示全部楼层

订正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
复制代码
发表于 2023-8-9 13:22:30 | 显示全部楼层
本帖最后由 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楼代码大同小异,思路基本相同。
如果含有(&<等)特殊字符则代码无效。
发表于 2023-8-9 15:04:01 | 显示全部楼层
回复 1# 56335571


    参考:http://bbs.bathome.net/thread-64867-1-1.html
发表于 2023-8-9 16:30:17 | 显示全部楼层
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\
复制代码
 楼主| 发表于 2023-8-9 19:35:03 | 显示全部楼层
回复 4# 77七
已解决,感谢随风大神的案例
发表于 2023-8-21 12:09:34 | 显示全部楼层
向各位学习  变量 。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 15:34 , Processed in 0.018974 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表