[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】求助生成/获取随机字符串的BAT脚本优化

写了一个非常笨拙的生成/获取随机字符串的小脚本,麻烦大佬给优化优化!

思路是:
把生成(确定长度的)随机字符串的bat脚本作为一个外部的公共bat文件,供其他的bat文件调用。

编写的时候遇到了2个大问题:

第一个大问题是:
在for循环里面使用变量嵌套,不会写。

根据论坛的帖子,学会了call,set s1=%%source_string:~%r1%,1%%这种能够展开变量嵌套的写法,
但是开启setloacl enabledelayedexpansion后,再把这种写法放到for循环里面,
就不大会写了。

比如,想生成一个4位的随机字符串,要循环4次,
计数的变量count肯定是!count!这种形式,
但是bat自带的%random%,还有%%source_string:~%r1%,1%%这个,需要怎么搞,就不会了。
所以,生成4位的随机字符串,就变成了下面这种看一眼就知道很笨拙的方法:
(小声嘀咕:可是下面写法确实能生成一个4位的随机字符呀~)(/手动笑哭)
  1. @echo off
  2. REM 打算使用这个bat生成4位的随机字符
  3. REM 随机字符包含数字和大小写字母
  4. REM 作为一个公用的子程序,供其他的程序调用
  5. set source_string=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  6. set /a r1=%random% %% 63
  7. set /a r2=%random% %% 63
  8. set /a r3=%random% %% 63
  9. set /a r4=%random% %% 63
  10. REM echo %r1%
  11. REM echo %r2%
  12. REM echo %r3%
  13. REM echo %r4%
  14. call,set s1=%%source_string:~%r1%,1%%
  15. call,set s2=%%source_string:~%r2%,1%%
  16. call,set s3=%%source_string:~%r3%,1%%
  17. call,set s4=%%source_string:~%r4%,1%%
  18. REM echo %s1%
  19. REM echo %s2%
  20. REM echo %s3%
  21. REM echo %s4%
  22. set s_rand=%s1%%s2%%s3%%s4%
  23. echo %s_rand%
  24. GOTO :EOF
复制代码
第二个大问题是:
怎么样把这个4位的随机字符串传给主程序使用,也不太会。

在Python里面,可以用类似 "变量 = 子程序名.随机字符串()"这样的方法,把值传进主程序。
(当然,需要主程序在一开始的时候import一下)

根据论坛的帖子,
学会了要是想使用call命令的话,需要在子程序里面加上GOTO :EOF这一句,
我试了一下,
要是把上面的笨拙方法写成主程序里面一个标签,然后调用标签里面%s_rand%变量,是可以的,
但是感觉不太实用,总不能每次写一个主程序,就把上面的笨拙方法的代码复制到主程序里面吧?
上面的笨拙方法就已经够笨拙了,这么搞岂不是笨上加笨?

最后想出来的不那么笨拙的办法是使用一个txt过程文件,
把笨拙方法生成的4位随机字符echo到这个txt过程文件里面,
然后在主程序里面读取这个txt过程文件。
(小声嘀咕:其实还是笨上加笨,可是确实获取到这个4位的随机字符呀~)(/手动笑哭)
笨上加笨的代码如下:
  1. @echo off
  2. rem this_is_the_main_bat
  3. type nul > test2.txt
  4. call myrand.bat >> test2.txt
  5. set /p main_rand= < test2.txt
  6. echo %main_rand%
  7. type test2.txt
  8. PAUSE
复制代码
两个笨办法凑一块儿,
最后就变成一个二仙桥版:“能拉(用),但是只能拉(用)一点点……” (/手动笑哭)
麻烦大佬们抽空给指点指点,优化优化~
非常感谢!


(小声嘀咕:Python的str对象内置了好多方法,要是bat也有就好了……)
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 2# qixiaobin0715

大佬,
您给的代码我运行了,非常好用!

第6行,for %%j in (!n!) do set m=!m!!var:~%%j,1! 这一句,
好帅啊!
我怎么就想不到呀!
向大佬学习!

谢谢大佬!
给大佬点赞!

TOP

随机字符串代码也不长,没必要单独搞一个bat:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  4. for /l %%i in (1,1,4) do (
  5.     set /a n=!random!%%62
  6.     for %%j in (!n!) do set m=!m!!var:~%%j,1!
  7. )
  8. echo,!m!
  9. pause
复制代码
1

评分人数

TOP

返回列表