2013-08-05 48 views
1

我的Windows批處理文件中出現「goto在這個時候是意外的」錯誤。就像下面。我不知道。任何人都可以幫助我?感謝轉到這個時候是意外的。批處理文件

@setlocal EnableExtensions EnableDelayedExpansion 
@echo off 
SET TEMPERL=%TMP%\perlversion.txt 
for /f "tokens=*" %%a in (%TEMPERL%) do (
    set line=%%a 
    if not "%line:subversion%"=="%line%" goto GETVERSION 
) 

:GETVERSION 
set mainver=%line:*perl=% 
set mainver=%mainver:~1,1% 
echo This is perl %mainver% 


:END 
endlocal 
+0

並不需要'then'? – DevZer0

+0

你有沒有試過裏面使用!變!而不是%變量%FOR循環? – Dale

+0

@ DevZer0'然後'不需要批處理 – foxidrive

回答

2

試試這個:

@echo off 
setlocal EnableExtensions 
SET "TEMPERL=%TMP%\perlversion.txt" 
for /f "usebackqdelims=" %%a in ("%TEMPERL%") do (
    set "line=%%a" 
    SETLOCAL EnableDelayedExpansion 
    if not "!line:subversion=!"=="!line!" (
     set "mainver=!line:*perl=!" 
     set "mainver=!mainver:~1,1!" 
     echo This is Perl !mainver! 
    ) 
    ENDLOCAL 
) 

你應該留下for循環代碼塊與goto。這使得cmd不穩定。

你也可以試試這個(適用於草莓的Perl):

for /f "tokens=2delims=()" %%a in ('perl --version') do echo This is Perl %%a 
for /f "tokens=4delims=(v)" %%a in ('perl --version') do echo This is Perl %%a 
+1

Endoro,使用goto離開循環是一種常見的技術 - 它不會使cmd不穩定全部吃掉。 – foxidrive

+0

@foxidrive如果你這樣做,我不知道'cmd'('stack','heap')的內存管理是怎麼回事。所以我總是試圖避免這一點,我從來沒有使用它,從來沒有需要它:)謝謝你的評論。 – Endoro

+0

'goto'裏面'for'是一個很好的方式(只有我知道)打破循環。從來沒有問題。 –

1

在您FOR循環,你需要

set "line=%%a" 
if not "!line:subversion=!"=="%%a" goto GETVERSION 

OR

set "line=%%a" 
if not "!line:subversion=!"=="%%a" goto GETVERSION 

BECAUSE %line%(或任何% var %)意味着PARSE-TIME變量的值,也就是在FOR開始執行之前的狀態。 !變種!意味着var運行時的值,即,因爲它在循環期間改變 - 但只有setlocal enabledelayedexpansion已被執行(它具有在這種情況下)

還要注意=第二!之前。這引入了替換串中的變量 - 它取代了目標(:=之間)的串,從而與由[無]替換任何字符串subversion計算line值的結構。

還要注意,在set line=%%a行中的%%a之後有空格。儘管您發佈的內容看起來經典的正確,但是尾部空格包含在指定的值中,因此%%a!line!不是同一件事。用括號聲明的引號方法確保所分配的字符串中不包含任何散落的尾部空格。最好使用這種結構 - 它可以節省很多頭部追蹤周圍的無形空間。

最後,我不能保證你的MAINVER解碼是正確的,因爲你還沒有公佈目標線的結構perlversion.txt

此外,如果你的目標線(包含字符串subversion做了一個在文件中不存在(或文件本身)丟失,你可能會得到意想不到的效果。

相關問題