2015-02-24 52 views
0

我寫了一個小腳本暫停的每個人之間的隨機量來顯示文本文件的每一行:批處理腳本錯誤:「/此時意外。」

SET pauseTime=10 
SET maxval=20 
SET minval=5 
FOR /f %%j in (search1.txt) DO (
    SET pauseTime=%RANDOM% * (%maxval% - %minval% + 1)/32768 + %minval% 
    ECHO.%pauseTime% 
    TIMEOUT %pauseTime% 
    ECHO.%%j 
) 

在cmd.exe的運行這給了我:
C:\用戶\ Tim \ Desktop> SET minval = 5
/此時意外。

但是,如果我簡單地做:

FOR /f %%j in (search1.txt) DO (
    ECHO.%%j 
) 

我得到印有沒有錯誤

這是怎麼回事所有行?

回答

3

您需要將/A開關添加到您的SET語句中以執行數學運算。 (我平時也刪除任何嵌入的空格得到它的正常工作爲好。)

SET /A pausetime=%RANDOM%*(%maxval%)-%minval%)/32768+%minval% 

你要還造成批量處理器無法正常發放的for表達式中括號(誤差數字表達式中的嵌套對)。您可以修復由括號內打破了表達的那部分分離出來,單獨的變量,然後使用該變量來代替部分:

SET pauseTime=10 
SET maxval=20 
SET minval=5 
SET /A maxmin=%maxval% - %minval% + 1 
FOR /f %%j in (search1.txt) DO (
    SET /A pauseTime=%RANDOM% * %maxmin%/32768 + %minval% 
    ECHO. %pauseTime% 
    TIMEOUT %pauseTime% 
    ECHO. %j% 
) 
+0

按照你的建議,我改變了我的'SET pauseTime =%RANDOM%*(%MAXVAL% - %MINVAL%+ 1)/ 32768 +%MINVAL%'到'SET/A pauseTime =%RANDOM%*(% MAXVAL% - %MINVAL%)/ 32768 +%MINVAL%'。現在運行該腳本給我:_C:\用戶\添\桌面> SET MINVAL = 5 /32768 + 5在此time._ – 2015-02-24 18:52:20

+0

代'意想不到%MAXVAL%'和'%MINVAL%'表達式使用其數值擺脫錯誤...所以我想這個問題必須與一些擴展百分比的屬性? – 2015-02-24 19:03:29

+0

我明白了。它是嵌套的括號對。我將編輯以包含修復程序。 – 2015-02-24 19:27:49

1

這裏的問題是因爲你使用嵌套()括號該批次無法處理並導致您的問題,您可能需要將您的暫停時間計算分成2行。

see this article

The CMD shell statement does not use any great intelligence when evaluating parenthesis, so for example the command below will fail:

IF EXIST MyFile.txt (ECHO Some(more)Potatoes)

1

作爲其他的答案中所提到的,問題是由嵌套括號引起的。

而是避免他們,你也可以通過^字符逃脫他們 - 這工作:

IF EXIST MyFile.txt (ECHO Some^(More^)Potatoes) 

沒有插入符^這裏,命令行解釋採取第一)關閉第一(


然而,應用上述逃逸技術原來的問題的代碼避免了錯誤信息,但不結果在工作腳本,即使內SETSET /a取代(如由所提到@KenWhite),因爲你需要建立delayed environment variable expansion;否則,顯示的pauseTime值始終是最初的一個,10。下面的修復工作:

@ECHO OFF 
SET pauseTime=10 
SET maxval=20 
SET minval=5 
SETLOCAL EnableDelayedExpansion 
FOR /f %%j in (search1.txt) DO (
    SET /a pauseTime=!RANDOM!*^(maxval-minval+1^)/32768+minval 
    ECHO.!pauseTime! 
    TIMEOUT !pauseTime! 
    ECHO.%%j 
) 
ENDLOCAL 

這裏,SETLOCAL聲明使FOR命令執行前的延遲擴展。在FOR循環體,%pauseTime%%RANDOM%分別由!pauseTime!!RANDOM!,取代;那些變量會受到延遲擴展的影響(因爲包含了!!),這意味着在解析整個FOR命令時,它們不會(像往常一樣)立即擴展,但執行時會立即擴展。爲便於清晰起見,我除去從其它變量%%SET /a命令由於當/a開關是本它們不是必需的(注意,也支持一個操作者% !!)。

注:此腳本運行後,pauseTime被複位到初始值10作爲SETLOCAL/ENDLOCAL塊構成新的局部環境的命名空間;如果您需要最後一個值,請將ENDLOCAL替換爲ENDLOCAL & SET pauseTime=%pauseTime%;這個使用標準的立即擴大...


然而,由於minvalmaxval是在腳本中的常量是最聰明的一次僅做FOR計算maxval-minval+1外,像@KenWhite建議。