goto此时出人意料。批处理文件

时间:2013-08-05 04:21:42

标签: if-statement batch-file

我的Windows批处理文件中出现“此时意外发生了”错误。就像下面一样。我不知道。有人可以帮帮我吗?感谢

@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

2 个答案:

答案 0 :(得分: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 :(得分: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 !表示RUN-TIME值为var,也就是说,它在循环期间发生变化 - 但只有setlocal enabledelayedexpansion已执行(它在这个案例)

另请注意第二个=之前的!。这会在变量中引入替换字符串 - 替换目标的字符串(在:=之间),结构因此使用任何字符串{{1来计算line的值被[nothing]取代。

另请注意,subversion行中的%%a后面有尾随空格。虽然您发布的内容似乎在经典上是正确的,但是所分配的值中的尾随空格包含在内,因此set line=%%a%%a不是同一个东西。 enclose-the-statement-in-quotes方法确保所分配的字符串中不包含任何杂散尾随空格。最好使用这种结构 - 它可以节省大量的头部划痕,追逐无形的空间。

最后,我无法保证您对!line!的解码是正确的,因为您尚未在MAINVER

中发布目标行的结构

如果您的目标行(文件中不存在包含字符串perlversion.txt的行(或文件本身)),则可能会出现意外结果。