2016-06-13 134 views

回答

3

你应该用在循环的变量delayed expansion,使他们成为在执行时,而不是在扩大解析时间:

@echo off 
setLocal EnableDelayedExpansion 
set arg=%1 

FOR /L %%i IN (1, 1, %arg%) DO (
    set FILENAME=file!RANDOM!.txt 
    copy /b NUL !FILENAME! 
) 

pause 
+0

谢谢,它帮助:) – Katie

+1

虽然这种方法将是在许多情况下足够,要知道''RANDOM在'FOR/L'循环可能会返回重复号码;!您可能会感兴趣的[此帖](http://stackoverflow.com/q/34406594)涉及的生成随机数的无重复... – aschipfl

+0

@aschipfl:谢谢你的笔记 –

0

这种方法确保不发生碰撞,也就是生成的随机数是唯一的:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

set "ARG=%~1" 
set /A ARG+=0 

if %ARG% LSS 1472 (goto :FEW) else (goto :MANY) 


:MANY 
for /L %%I in (0,1,32767) do (
    set "RND_!RANDOM!=%%I" 
) 
set /A COUNT=0 
for /F "tokens=2 delims==" %%J in ('set RND_') do (
    set /A COUNT+=1 
    if !COUNT! GTR %ARG% goto :SKIP 
    ECHO copy /B nul "file%%J.txt" 
) 
:SKIP 
goto :END 


:FEW 
set /A COUNT=0 
:LOOP 
if %COUNT% GEQ %ARG% goto :CONT 
set /A COUNT+=1 
set "RND_%COUNT%=%RANDOM%" 
set /A TEST=COUNT-1 
for /L %%I in (1,1,%TEST%) do (
    if !RND_%%I! EQU !RND_%COUNT%! (
     set /A COUNT-=1 
    ) 
) 
goto :LOOP 
:CONT 
for /L %%J in (1,1,%COUNT%) do (
    ECHO copy /B nul "FILE!RND_%%J!.txt" 
) 
goto :END 


:END 
endlocal 
exit /B 

调用上面的脚本将随机文件的数量作为命令行参数。

脚本中包含两个例程,用于产生随机数:

  • :FEW:随机数被收集在一个阵列式的可变RND_#其中#表示从1索引到的项目数是产生。将每个新生成的数字与以前的所有数字进行比较,每当发现匹配时,重复生成,直到达到总量。最后生成空的随机文件。
  • :MANY:独特的随机数与此类似职位的一个办法产生:How to generate a list of random numbers without duplicates in pure batch scripting?

根据随机文件的数量要创建,适当的程序选择。例程:FEW只适用于少数随机数字;只要总数目增加,接收重复,因此该随机数生成的所述重复的可能性使得它相当低效的。
例行:MANY是几个随机数缓慢,因为总有产生32768项随机序列;一旦总量增加,这种方法是整体性能更好的选择。
所使用的限制次数1472低于该:FEW例程选择仅仅是一个任意值在这里。

有大写在用于测试的copy命令前缀ECHO命令。无论何时您想要实际创建任何文件,只需将其删除即可。

相关问题