通过一个小公式,您可以将随机值的范围(0 到 32768)更改为更小的值。通过使该计算成为子程序,您可以轻松地多次调用它。
使用 setlocal 可以防止环境污染。下面的脚本用一个随机序列号填充变量serial,该序列号由 1000 到 9999 之间的 5 个数字组成。
版本 1:
@echo off
setlocal
:: Generate 5 random numbers of 4 digits
call :random code1
call :random code2
call :random code3
call :random code4
call :random code5
:: Combine them and show the output.
set serial=%code1%-%code2%-%code3%-%code4%-%code5%
echo %serial%
pause
:: Clear all variables, except %serial%
endlocal & set serial=%serial%
goto :eof
:random
:: Version 1: Generates a random number between 1000 and 9999
setlocal
set /a nr=%random%*8999/32767+1000
endlocal & set %1=%nr%
goto :eof
版本 2:
由于 :random 是一个很好的独立子例程,如果需要,您可以轻松更改它。例如,如果 1000 到 9999 不够好,您可以获取 0000 到 9999 的范围,并通过将子例程替换为:
:random
:: Version 2: Generates a random number between 0000 and 9999
setlocal
set /a nr=%random%*9999/32767
set nr=0000%nr%
set nr=%nr:~-4%
endlocal & set %1=%nr%
代码分解。
-
setlocal 启动一个新的本地环境。环境变量被复制到这个新环境中,但是如果您更改添加或删除它们,这不会影响此“本地”范围之外的环境变量。另请参阅endlocal。
-
:: as rem 用于 cmets
-
:random 是一个标签。以冒号开头的标识符表示标签。标签可用于程序的控制流。这个标签后面的代码我调用了一个子程序。您可以跳转到一个标签来执行子程序(调用)并从它返回(goto :eof)以继续正常执行。就好像你在调用一个单独的批处理文件,只是它嵌入在同一个文件中。
-
call 调用批处理文件或子程序。通过指定标签,您可以跳转到批处理文件的另一部分,但与goto 不同的是,call 允许您跳转回调用位置。
-
goto :eof 跳转到脚本的末尾。如果您使用call 调用了标签,则此命令将跳回调用位置并从那里继续执行。所以这就像从一个函数中返回。
- code1 到 code5。我指定要在其中获得子例程结果的变量的名称。这样,我可以调用它五次来填充五个不同的变量。
-
endlocal 结束以 startlocal 开头的本地范围。
-
endlocal & set serial=%serial%。这是一个技巧。局部作用域结束,但在结束之前(通过执行该行),命令解释器解释整行,扩展变量。这允许您将外部(或全局)范围内的变量设置为在内部范围内创建的值。我基本上使用它来指定子程序的返回值,并从脚本中返回变量serial。
-
endlocal & set %1=%nr% 在子程序中使用。这将设置在调用的第一个参数中指定名称的变量。所以%1 扩展为code1、code2 等。这样,子程序可以设置任何变量而无需知道它设置的是哪个变量。
-
set /a 设置一个变量,但允许使用简单的算术公式(计算)。通过这种方式,您可以计算介于 1000 和 9999(版本 1)或 0 和 9999(版本 2)之间的值。
- 在版本 2 中,如果值更短,我会用零填充。这分三个步骤完成。首先生成数字,然后在其前面添加零,最后抓取最后四个字符,使用符号
%nr:~-4%。
如果这一切对你来说太复杂了,你可以复制公式本身并跳过所有其余部分:
版本 3:
@echo off
set /a code1=%random%*9999/32767
set code1=0000%code1%
set /a code2=%random%*9999/32767
set code2=0000%code2%
set /a code3=%random%*9999/32767
set code3=0000%code3%
set /a code4=%random%*9999/32767
set code4=0000%code4%
set /a code5=%random%*9999/32767
set code5=0000%code5%
set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause
版本 4:
非常非常简单的版本。
Jahwi 建议使用模运算来限制数字,因此使用set /a nr=%random%%%10000 会给您一个介于 0 和 9999 之间的数字。但是,除法并不是真的均匀。由于您得到一个介于 0 和 32767 之间的随机数,因此仅执行此模运算将导致 0 和 2767 之间的数字比 2768 和 9999 之间的数字更频繁地出现。
如果这不打扰您,您可以使用此方法,或者只是将值截断为 4 位数字,这基本上具有相同的效果。下面的代码只是截断随机数,并确保它们用零填充,直到长度为 4。这大约是尽可能短,但请记住,这些数字不如版本 1 到 3。
@echo off
set code1=0000%random%
set code2=0000%random%
set code3=0000%random%
set code4=0000%random%
set code5=0000%random%
set serial=%code1:~-4%-%code2:~-4%-%code3:~-4%-%code4:~-4%-%code5:~-4%
echo %serial%
pause