标题: [文本处理] 【已解决】求助生成/获取随机字符串的BAT脚本优化 [打印本页]
作者: HappyXxxxxx 时间: 2023-5-22 09:20 标题: 【已解决】求助生成/获取随机字符串的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位的随机字符呀~)(/手动笑哭)- @echo off
-
- REM 打算使用这个bat生成4位的随机字符
- REM 随机字符包含数字和大小写字母
- REM 作为一个公用的子程序,供其他的程序调用
-
- set source_string=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
-
- set /a r1=%random% %% 63
- set /a r2=%random% %% 63
- set /a r3=%random% %% 63
- set /a r4=%random% %% 63
-
- REM echo %r1%
- REM echo %r2%
- REM echo %r3%
- REM echo %r4%
-
- call,set s1=%%source_string:~%r1%,1%%
- call,set s2=%%source_string:~%r2%,1%%
- call,set s3=%%source_string:~%r3%,1%%
- call,set s4=%%source_string:~%r4%,1%%
-
- REM echo %s1%
- REM echo %s2%
- REM echo %s3%
- REM echo %s4%
-
- set s_rand=%s1%%s2%%s3%%s4%
- echo %s_rand%
- GOTO :EOF
复制代码
第二个大问题是:
怎么样把这个4位的随机字符串传给主程序使用,也不太会。
在Python里面,可以用类似 "变量 = 子程序名.随机字符串()"这样的方法,把值传进主程序。
(当然,需要主程序在一开始的时候import一下)
根据论坛的帖子,
学会了要是想使用call命令的话,需要在子程序里面加上GOTO :EOF这一句,
我试了一下,
要是把上面的笨拙方法写成主程序里面一个标签,然后调用标签里面%s_rand%变量,是可以的,
但是感觉不太实用,总不能每次写一个主程序,就把上面的笨拙方法的代码复制到主程序里面吧?
上面的笨拙方法就已经够笨拙了,这么搞岂不是笨上加笨?
最后想出来的不那么笨拙的办法是使用一个txt过程文件,
把笨拙方法生成的4位随机字符echo到这个txt过程文件里面,
然后在主程序里面读取这个txt过程文件。
(小声嘀咕:其实还是笨上加笨,可是确实获取到这个4位的随机字符呀~)(/手动笑哭)
笨上加笨的代码如下:- @echo off
-
- rem this_is_the_main_bat
-
- type nul > test2.txt
-
- call myrand.bat >> test2.txt
- set /p main_rand= < test2.txt
-
- echo %main_rand%
- type test2.txt
-
- PAUSE
复制代码
两个笨办法凑一块儿,
最后就变成一个二仙桥版:“能拉(用),但是只能拉(用)一点点……” (/手动笑哭)
麻烦大佬们抽空给指点指点,优化优化~
非常感谢!
(小声嘀咕:Python的str对象内置了好多方法,要是bat也有就好了……)
作者: qixiaobin0715 时间: 2023-5-22 10:01
随机字符串代码也不长,没必要单独搞一个bat:- @echo off
- setlocal enabledelayedexpansion
- set var=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
- for /l %%i in (1,1,4) do (
- set /a n=!random!%%62
- for %%j in (!n!) do set m=!m!!var:~%%j,1!
- )
- echo,!m!
- pause
复制代码
作者: HappyXxxxxx 时间: 2023-5-22 10:34
回复 2# qixiaobin0715
大佬,
您给的代码我运行了,非常好用!
第6行,for %%j in (!n!) do set m=!m!!var:~%%j,1! 这一句,
好帅啊!
我怎么就想不到呀!
向大佬学习!
谢谢大佬!
给大佬点赞!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |