我需要编写一个批处理脚本,我想在其中接受一个参数(让我们称之为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
答案 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
命令用于测试。无论何时您想要实际创建任何文件,只需删除它们即可。