一.问题情况
由于需要在不同平台注册每个平台要求的密码强度又不同(比如是否需要特殊字符),需要生成不同的随机字符密码,在线的密码字符生成器有的会收集密码生成对应的MD5值用于暴力撞库等安全风险,还是需要一个本地的生成方法,所以直接使用windows的批处理生成,简单又好用,以前只用过vbs脚本的生成,bat还要带一个vbs脚本文件,最后还是优化成了一个单独的bat文件。
二解决办法
直接新建一个bat文件然后保存代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
@echo off & setlocal enabledelayedexpansion chcp 65001 >nul :: 基础字符集(62字母数字) set "safe_chars=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" set "safe_symbols=!#$%%&()*+,-.:;=@[]^_{}~" :: 用户配置输入 :input_loop set /p "symbol_flag=是否包含特殊符号:#$%%&()*+,-.:;=@[]^_{}~,默认为英文大小写+数字组合(1=包含/0=不包含): " if not "!symbol_flag!"=="1" if not "!symbol_flag!"=="0" ( echo 输入无效,请重新输入 goto input_loop ) :: 动态构建字符池 if "!symbol_flag!"=="1" ( set "char_pool=!safe_chars!!safe_symbols!" ) else ( set "char_pool=!safe_chars!" ) :: 密码长度输入 :length_input set /p "length=请输入随机密码长度(1-128): " set /a "length=!length!" 2>nul if !length! lss 1 ( echo 长度无效,请重新输入 goto length_input ) if !length! gtr 128 ( echo 长度无效,请重新输入 goto length_input ) :: 生成随机密码 set "output=" for /l %%i in (1,1,!length!) do ( set /a "rand=!random! %% 62" if "!symbol_flag!"=="1" ( set /a "rand=!random! %% 76" ) for /f %%n in ("!rand!") do ( set "pick=!char_pool:~%%n,1!" set "output=!output!!pick!" ) ) echo 生成的随机密码: !output! pause |
双击bat批处理文件直接使用,先输入0或者1决定生成的随机字符是否带特殊字符,特殊字符可以在safe_symbols变量里自定义,默认的字符safe_chars为英文大小写加数字,也可以自己定义,再输入需要生成的字符长度,很多平台只限制了最小密码长度,但是实际也有最大密码长度限制,但是都不提示,经常生成了一个长密码复制进去以后再登录提示密码不对,其实是密码被截断了,所以最好生成一个20位左右的密码足够用就行了。如果出现中文乱码可以修改:
1 2 3 4 |
chcp 65001 >nul 改为 chcp 936>nul 或者直接删除这行也行 |
主要是因为系统和cmd环境还有保存bat时的字符编码不符造成的乱码,文本如果为GB2312编码就用936如果为UTF-8就用65001。win11环境上面的脚本执行中文是正常的。