在批处理脚本(Windows)中使用随机文件名创建n个文件 - 我的脚本只创建一个文件

时间:2016-06-13 20:51:06

标签: windows loops batch-file

我需要编写一个批处理脚本,我想在其中接受一个参数(让我们称之为n),并使用随机文件名创建n个空文件。但是,我的方法似乎不起作用,因为它不会创建n个文件,只会创建一个:

@echo off

set arg=%1

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

pause 

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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在此处只是一个任意值。

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