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
4

2 回答 2

2

try this:

@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
)

You should not leave a for loop code block with goto. This makes cmd unstable.

You might also try this (works for strawberry 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
于 2013-08-05T06:37:23.950 回答
1

在你的FOR循环中,你需要

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

或者

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

BECAUSE %line%(或任何%var %)表示变量的 PARSE-TIME 值,即在FOR开始执行之前的状态。!var!表示 的 RUN-TIME 值var,也就是说,它在循环期间发生变化 - 但仅在setlocal enabledelayedexpansion已执行时(在这种情况下它具有)

还要注意=第二个之前的!。这在变量中引入了替换字符串 - 替换目标的字符串(在:和之间=),结构因此计算用 [nothing] 替换的line任何字符串的值。subversion

另请注意,行%%a中的后面有尾随空格set line=%%a。尽管您发布的内容在经典上看起来是正确的,但尾随空格包含在分配的值中,因此%%a并不是!line!一回事。enclose-the-statement-in-quotes 方法确保任何杂散的尾随空格不包含在分配的字符串中。最好使用这种结构 - 它可以节省很多令人头疼的追逐无形空间。

最后,我不能保证你的解码MAINVER是正确的,因为你还没有发布目标行的结构perlversion.txt

此外,如果您的目标行(包含该字符串的行在subversion文件(或文件本身)中不存在)丢失,您可能会得到意想不到的结果。

于 2013-08-05T13:40:41.190 回答