Board logo

标题: [数值计算] rstr.bat --- 生成随机字符串 [打印本页]

作者: tmplinshi    时间: 2013-6-12 19:09     标题: rstr.bat --- 生成随机字符串

本帖最后由 tmplinshi 于 2013-9-27 23:29 编辑

e:\我的文档\桌面>rstr /?
rstr.bat --- 生成随机字符串

用法: rstr [字符个数 | 最小字符个数-最大字符个数] [字符串]
        [字符个数]      默认值: 10
        [字符串]        默认值: abcdefghijklmnopqrstuvwxyz0123456789
                        可以使用四个正则: \d [0-9] [a-z] [a-zA-Z]

示例: rstr
      rstr 10
      rstr 10-15
      rstr 10 "0123&abc"
      rstr "" \d@-_


e:\我的文档\桌面>rstr
ta946ou122

e:\我的文档\桌面>rstr 3
3zv

e:\我的文档\桌面>rstr 3 \d
646
  1. :: rstr.bat --- 生成随机字符串
  2. :: v1.00 / 2013-6-12 / tmplinshi
  3. @echo off
  4. setlocal enabledelayedexpansion
  5. if "%~1" == "/?" goto usage
  6. :: ------------------- 默认值 -------------------
  7. set d_len=10
  8. set d_StrList=abcdefghijklmnopqrstuvwxyz0123456789
  9. :: ----------------------------------------------
  10. :: =================
  11. :: 生成随机字符串
  12. :: =================
  13. ::
  14. rem ############## 获取字符个数
  15. if "%~1" == "" (set len=%d_len%) else (set "len=%~1")
  16. rem 随机“最小字符个数-最大字符个数”
  17. if "%len:-=%" neq "%len%" (
  18.         for /f "tokens=1,2 delims=- " %%a in ("%len%") do (
  19.                 set /a min_len = %%a, max_len = %%b
  20.                 set /a "len = %random% %% (max_len-min_len+1) + min_len"
  21.         )
  22. )
  23. rem ############## 获取字符串
  24. if "%~2" == "" (
  25.         set StrList=%d_StrList%
  26. ) else (
  27.         set "StrList=%~2"
  28.         rem 替换正则
  29.         set StrList=!StrList:\d=0123456789!
  30.         set StrList=!StrList:[0-9]=0123456789!
  31.         set StrList=!StrList:[a-z]=abcdefghijklmnopqrstuvwxyz!
  32.         set StrList=!StrList:[a-zA-Z]=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!
  33. )
  34. rem ############## 计算字符串长度
  35. call :StrLen "%StrList%"
  36. rem ############## 生成随机字符串
  37. set _out=
  38. for /l %%n in (1 1 %len%) do (
  39.         set /a pos = !random! %% StrLen
  40.         for %%p in (!pos!) do set _out=!_out!!StrList:~%%p,1!
  41. )
  42. rem ############## 输出结果
  43. echo,!_out!
  44. exit /b
  45. :: =================
  46. :: 计算字符串长度
  47. :: =================
  48. ::
  49. :StrLen <string>
  50. set "_StrList=%~1"
  51. set StrLen=1
  52. for %%a in (2048 1024 512 256 128 64 32 16) do (
  53.         if "!_StrList:~%%a!" neq "" (
  54.                 set /a StrLen += %%a
  55.                 set _StrList=!_StrList:~%%a!
  56.         )
  57. )
  58. set _StrList=!_StrList!fedcba9876543210
  59. set /a StrLen += 0x!_StrList:~16,1!
  60. goto :eof
  61. :: =================
  62. :: 显示帮助
  63. :: =================
  64. ::
  65. :usage
  66. echo %~nx0 --- 生成随机字符串
  67. echo,
  68. echo 用法: %~n0 [字符个数 ^| 最小字符个数-最大字符个数] [字符串]
  69. echo         [字符个数]        默认值: 10
  70. echo         [字符串]        默认值: abcdefghijklmnopqrstuvwxyz0123456789
  71. echo                         可以使用四个正则: \d [0-9] [a-z] [a-zA-Z]
  72. echo,
  73. echo 示例: %~n0
  74. echo       %~n0 10
  75. echo       %~n0 10-15
  76. echo       %~n0 10 "0123&abc"
  77. echo       %~n0 "" \d@-_
复制代码

作者: 523066680    时间: 2013-8-4 23:15

大概试了一下,蛮好用的
支持一下。
作者: 狱渊    时间: 2013-8-7 15:54

试了一下 感觉不错 命令行工具的感觉啊
作者: mikezunya    时间: 2013-8-8 15:31

本帖最后由 mikezunya 于 2013-8-8 15:42 编辑

rstr.exe  这个哪里有下载的呢? 跪求。我这边都删除了。好多外部命令都不见了~
作者: tmplinshi    时间: 2013-8-8 16:41

rstr.exe  这个哪里有下载的呢? 跪求。我这边都删除了。好多外部命令都不见了~
mikezunya 发表于 2013-8-8 15:31



是 bat,不是 exe。把顶楼的代码保存为 rstr.bat。
作者: weichenxiehou    时间: 2013-9-17 21:11

回复 5# tmplinshi
很好的东西,有做正则表达式,虽然只是字符串替换,但呈现的特性是美丽的,有求字符串长度的折半算法,实用性高,因为论坛经常有人问生成随机字符串的问题,也有标准exe的感觉,帮助内容很规范。
好的东西需要推广和完善,需要经得起实践的检验,建议以函数(实际为代码块)的方式发布,毕竟bat和exe是不一样的,如:

1.按照使用一般命令的习惯,使用者一般会忘记用call调用,如下的代码就会导致echo,456得不到执行:
  1. @echo off
  2. echo,123
  3. rstr.bat
  4. echo,456
复制代码
正确的用法:
  1. @echo off
  2. echo,123
  3. call,rstr.bat
  4. echo,456
复制代码
同理,因为忘记用call调用,会开启新的cmd进程执行rstr.bat,如下的代码会产生含执行路径的输出,影响效果或其他:
  1. @echo off
  2. for /l %%a in (1 1 5) do rstr
复制代码
输出:
  1. da84f0qq8s
  2. e:\test>rstr
  3. tv78846dp3
  4. e:\test>rstr
  5. nxpx0f6hk0
  6. e:\test>rstr
  7. jutis5882j
  8. e:\test>rstr
  9. aun0gda121
复制代码
正确的用法:
  1. @echo off
  2. for /l %%a in (1 1 5) do call,rstr
复制代码
2.可能因为在很小的时间间隔内做相同的初始化工作的原因,如下的代码会产生重复的字符串,原因不明,猜测同一bat会分配相同的资源给for/f的命令部分使用。
  1. @echo off
  2. for /f "delims=" %%b in ('rstr') do echo,%%b
  3. for /f "delims=" %%b in ('rstr') do echo,%%b
  4. for /f "delims=" %%b in ('rstr') do echo,%%b
  5. for /f "delims=" %%b in ('rstr') do echo,%%b
  6. for /f "delims=" %%b in ('rstr') do echo,%%b
  7. for /f "delims=" %%b in ('rstr') do echo,%%b
  8. for /f "delims=" %%b in ('rstr') do echo,%%b
  9. for /f "delims=" %%b in ('rstr') do echo,%%b
  10. for /f "delims=" %%b in ('rstr') do echo,%%b
  11. for /f "delims=" %%b in ('rstr') do echo,%%b
  12. for /f "delims=" %%b in ('rstr') do echo,%%b
  13. for /f "delims=" %%b in ('rstr') do echo,%%b
  14. for /f "delims=" %%b in ('rstr') do echo,%%b
  15. for /f "delims=" %%b in ('rstr') do echo,%%b
  16. for /f "delims=" %%b in ('rstr') do echo,%%b
  17. for /f "delims=" %%b in ('rstr') do echo,%%b
  18. for /f "delims=" %%b in ('rstr') do echo,%%b
  19. for /f "delims=" %%b in ('rstr') do echo,%%b
  20. for /f "delims=" %%b in ('rstr') do echo,%%b
  21. for /f "delims=" %%b in ('rstr') do echo,%%b
复制代码
输出:
  1. 3rggb4hzgo
  2. 3rggb4hzgo
  3. 3rggb4hzgo
  4. 3rggb4hzgo
  5. 3rggb4hzgo
  6. 3rggb4hzgo
  7. frwrek6nok
  8. frwrek6nok
  9. frwrek6nok
  10. frwrek6nok
  11. frwrek6nok
  12. frwrek6nok
  13. frwrek6nok
  14. frwrek6nok
  15. frwrek6nok
  16. frwrek6nok
  17. frwrek6nok
  18. frwrek6nok
  19. frwrek6nok
  20. frwrek6nok
复制代码

作者: tmplinshi    时间: 2013-9-19 14:11

回复 6# weichenxiehou


谢谢补充
作者: dengyuli    时间: 2013-9-27 21:10

我把rstr转成了exe,结果还是很好用,而且还省了call调用,方便了很多




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