2016-06-13 42 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命令。無論何時您想要實際創建任何文件,只需將其刪除即可。

相關問題