2012-11-29 89 views
0

我想創建一個批處理文件,它將循環2到10之間的隨機數並從文本文件中拉出一個隨機行時間並顯示它。批處理文件從文件中隨機抽取一個字符串並循環一次隨機數

set var1=%RANDOM% 
set /a var2=(var1*9/32768)+2 
for /l %%x in (1,1,%var2%) do (
set "lines=0" 
for /f "tokens=*" %%a in (c:\myfile.txt) do set /a "lines+=1" 
set /a "skip=%var1% %% lines" 
if %skip% lss 1 (set "skip=") else (set "skip=skip=%skip%") 
for /f "skip=%skip% tokens=*" %%a in (c:\myfile.txt) do set "item=%%a"&goto display 

:display 
echo %item% 
) 

這是兩個不同的代碼段上自己的每一項工作,但我無法將它們整合在一起。

下面的代碼每次運行時都會在文件中顯示一個隨機行。

set "lines=0" 
for /f "tokens=*" %%a in (c:\myfile.txt) do set /a "lines+=1" 
set /a "skip=%random% %% lines" 
if %skip% lss 1 (set "skip=") else (set "skip=skip=%skip%") 
for /f "%skip% tokens=*" %%a in (c:\myfile.txt) do set "item=%%a"&goto display 
:display 
echo %item% 

而這段代碼會在2到10次之間顯示1。

@echo off 
set var1=%RANDOM% 
set /a var2=(var1*9/32768)+2 
for /l %%x in (1,1,%var2%) do (
echo 1 
) 

我可能只是忽略了明顯的,但我不做很多批處理腳本。

回答

1

你有幾個問題:

  • 你帶括號的塊中定義變量skip(溶解氧條款),然後嘗試在同一迴路中使用%skip%。這是行不通的,因爲當整個代碼塊被解析時變量被展開 - 在值被設置之前!通常解決方案是使用延遲擴展,但不能在FOR/F選項中使用延遲擴展。解決方案是在塊外部調用。

  • 您的邏輯在每次迭代中使用相同的隨機數。我將你所聲明的要求解釋爲意味着你想爲每次迭代使用不同的隨機數。

  • 你的GOTO打破了你的FOR循環。如果您發出GOTO,循環將不會繼續進行下一次迭代。

  • 您對var2的計算結果不理想。如果%RANDOM%*9超過4字節帶符號整數的最大值,它可能會失敗。我也不認爲它是給你想要的價值分配。您應該像使用隨機行號一樣使用mod運算符。

  • SKIP選項的值必須> = 1。如果你想要0,那麼你必須完全省略選項。你隔離代碼做這個正確的,但你的斷碼,斷ummmm :-)

其他改進:

  • 您計算文件中的每個迭代中的行數。你只需要這樣做一次。

  • 使用FIND來計算行數並使用FOR/F捕獲值會更有效率。 FOR/F忽略空白行,因此我使用FINDSTR來查找所有非空行,並將這些結果通過管道傳送到FIND以獲取計數。

  • 使用TOKENS=*將去掉前導空格,而DELIMS=將保留整個行。

  • 默認EOL選項是EOL=;,這意味着任何以;開頭的行都將被忽略。在每個空間之前插入逗號的奇怪語法並且沒有引號是需要將EOL設置爲無。

  • 我在文件名周圍添加了引號,並在文件名包含空格的情況下添加了USEBACKQ選項。

這裏是一個可行的解決方案

@echo off 
setlocal 
set "file=c:\myfile.txt" 
for /f %%N in ('findstr "." "%file%"^|find /c /v ""') do set lines=%%N 
set /a "iterations=%random% %% 8 + 2" 
for /l %%N in (1 1 %iterations%) do call :printRandomLine 
exit /b 

:printRandomLine 
set /a "skip=%random% %% %lines%" 
if %skip% lss 1 (set "skip=") else set "skip=skip^=%skip%" 
for /f usebackq^ %skip%^ delims^=^ eol^= %%A in ("%file%") do (
    echo %%A 
    exit /b 
) 
相關問題