2014-05-22 45 views
0

我有一個程序讀取文件並輸出隨機文件行號,但是當它輸出它時,它只是說「回聲關閉」是否可以解決這個問題? 這裏是我的代碼:行讀取程序不起作用

@echo off 
setlocal enabledelayedexpansion 
set Counter=1 
for /f "tokens=* delims=" %%x in (Lists.txt) do (
    set "Line_!Counter!=%%x" 
    set /a Counter+=1 
) 
set /a Counter=%random% * 100/32768 + 1 
echo %Counter% 
echo "%Line_!Counter!%" 
::Just displays echo is off 
pause 

回答

1

echo "!Line_%Counter%!"會工作。 (不太直觀,但如果你仔細想想,這很有意義)

1

你的代碼有兩個問題。

第一個被斯蒂芬指出。如果您閱讀this問題的答案,您將看到解析器在用感嘆號引用變量之前用百分比替換引用的變量。因此,當解析器嘗試處理%Line_!Counter!%時,!Counter!仍未在行中替換,因此%Line_!Counter!%是未定義的變量,並且被替換爲無。逆(!Line_%Counter%!)的工作原理是因爲當解析器到達該行時,第一個替換是百分比變量,最後是感嘆號變量。

第二個是邏輯錯誤。該行

set /a Counter=%random% * 100/32768 + 1 

將無法​​按預期工作,如果該文件有多於或少於100行。如果它有更多的話,那麼編號較高的行將永遠不會被選中。如果行數較少,可以選擇高編號的不存在的行,因爲它不存在,您將再次獲得echo is off消息嘗試回顯該變量。

@echo off 
setlocal enabledelayedexpansion 
set Counter=0 
for /f "tokens=* delims=" %%x in (Lists.txt) do (
    set /a Counter+=1 
    set "Line_!Counter!=%%x" 
) 
set /a "selected=%random% %% Counter + 1" 
echo %selected% 
echo "!Line_%selected%!" 
pause 
+0

沒有,我想這是100行,因爲大部分的文件有大約一百行 – Behavior

+0

@Behavior,張貼代碼選擇在readed線區域內的線。它適應急需的文件。如果它有更多的線條,則會考慮它們。如果它較少,則選擇不超過文件中的行數。我只是指出了可能的失敗點。如果不是你的情況,當然,不要使用它。 –

+0

@Behavior - 不,MC ND是正確的。如果您將隨機數固定在1到100之間,那麼您必須確保該文件始終至少有100行,否則會冒隨機選擇不存在的行的風險。像「多數」,「通常」,「很少」,「幾乎總是」,「幾乎從不」等短語不會幫助應用程序開發,除了可能的優化工作。一個寫得好的應用程序必須處理所有可能性,即使很少。 – dbenham