返回列表 发帖

[数值计算] 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
:: rstr.bat --- 生成随机字符串
:: v1.00 / 2013-6-12 / tmplinshi
@echo off
setlocal enabledelayedexpansion
if "%~1" == "/?" goto usage
:: ------------------- 默认值 -------------------
set d_len=10
set d_StrList=abcdefghijklmnopqrstuvwxyz0123456789
:: ----------------------------------------------
:: =================
:: 生成随机字符串
:: =================
::
rem ############## 获取字符个数
if "%~1" == "" (set len=%d_len%) else (set "len=%~1")
rem 随机“最小字符个数-最大字符个数”
if "%len:-=%" neq "%len%" (
        for /f "tokens=1,2 delims=- " %%a in ("%len%") do (
                set /a min_len = %%a, max_len = %%b
                set /a "len = %random% %% (max_len-min_len+1) + min_len"
        )
)
rem ############## 获取字符串
if "%~2" == "" (
        set StrList=%d_StrList%
) else (
        set "StrList=%~2"
        rem 替换正则
        set StrList=!StrList:\d=0123456789!
        set StrList=!StrList:[0-9]=0123456789!
        set StrList=!StrList:[a-z]=abcdefghijklmnopqrstuvwxyz!
        set StrList=!StrList:[a-zA-Z]=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!
)
rem ############## 计算字符串长度
call :StrLen "%StrList%"
rem ############## 生成随机字符串
set _out=
for /l %%n in (1 1 %len%) do (
        set /a pos = !random! %% StrLen
        for %%p in (!pos!) do set _out=!_out!!StrList:~%%p,1!
)
rem ############## 输出结果
echo,!_out!
exit /b
:: =================
:: 计算字符串长度
:: =================
::
:StrLen <string>
set "_StrList=%~1"
set StrLen=1
for %%a in (2048 1024 512 256 128 64 32 16) do (
        if "!_StrList:~%%a!" neq "" (
                set /a StrLen += %%a
                set _StrList=!_StrList:~%%a!
        )
)
set _StrList=!_StrList!fedcba9876543210
set /a StrLen += 0x!_StrList:~16,1!
goto :eof
:: =================
:: 显示帮助
:: =================
::
:usage
echo %~nx0 --- 生成随机字符串
echo,
echo 用法: %~n0 [字符个数 ^| 最小字符个数-最大字符个数] [字符串]
echo         [字符个数]        默认值: 10
echo         [字符串]        默认值: abcdefghijklmnopqrstuvwxyz0123456789
echo                         可以使用四个正则: \d [0-9] [a-z] [a-zA-Z]
echo,
echo 示例: %~n0
echo       %~n0 10
echo       %~n0 10-15
echo       %~n0 10 "0123&abc"
echo       %~n0 "" \d@-_COPY
1

评分人数

    • 523066680: Thanks for sharing.PB + 12 技术 + 5

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

TOP

回复 6# weichenxiehou


谢谢补充

TOP

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

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

TOP

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



是 bat,不是 exe。把顶楼的代码保存为 rstr.bat。

TOP

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

rstr.exe  这个哪里有下载的呢? 跪求。我这边都删除了。好多外部命令都不见了~

TOP

试了一下 感觉不错 命令行工具的感觉啊

TOP

大概试了一下,蛮好用的
支持一下。
[url=][/url]

TOP

返回列表