2013-08-05 68 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做了一个在文件中不存在(或文件本身)丢失,你可能会得到意想不到的效果。

相关问题