当前位置: 首页 > 知识库问答 >
问题:

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

朱运诚
2023-03-14

我的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个答案

万高畅
2023-03-14

FOR循环中,您需要

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

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

因为%line%(或任何%var%)表示变量的解析时间值,也就是说,在FOR开始执行之前<代码> 变量表示var的运行时值,也就是说,当它在循环过程中发生变化时——但仅当执行了setlocal enabledelayedexpansion时(在本例中是这样)

还要注意第二个之前的= 。这在变量中引入了替换字符串——替换目标的字符串(在=之间),该结构用[nothing]替换任何字符串subversion,从而计算的值。

还请注意,设置行=%%a行中的%%a后面有尾随空格。虽然你所发布的内容看起来经典地正确,但后面的空格包含在指定的值中,因此%%a!排队 不是一回事。将语句括在引号中的方法可确保指定的字符串中不包含任何多余的尾随空格。最好使用这种结构——它可以省去很多追逐周围看不见的空间的麻烦。

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

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

邹书
2023-03-14

试试这个:

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

您不应该为带有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

 类似资料:
  • 错误:此时安装意外。 当我在CMD上运行此脚本时,安装应用程序后,突出显示的(粗体)echo语句中会出现错误。我尝试过删除@ECHO OFF,但似乎不起作用。请建议。 下面是代码:

  • 在运行这个脚本后,我发现一些软件出乎意料,这次我使用的是64位windows 7。正在尝试使用注册表获取软件的安装位置。如果我回显了_名称,那么我就得到了正确的安装位置,但脚本在if-else中退出,表示这次某个软件出人意料

  • 请使用下面的脚本作为参考。嗯,我正在尝试进入编程领域,我正在创建我的批处理rpg,看看我是否可以做到......无论如何,有点碰壁:我一直收到“goto此时出乎意料”的错误。错误如下:最初,在标签游戏(: game)之后,输入系统正常工作,但不正确(即您输入输入4并获得8的操作,输入8却什么也没有获得,等等)。我改变了一些东西,但我不确定我改变了什么......导致在到达标签游戏时出现“错误:go

  • 问题内容: 因此,我希望它不会被编译,并且不会: 但这确实是: 是什么赋予了?它也不应该编译吗? 另外,由于运算符,这个问题很难找到。 问题答案: Java将工作解释为1加2。请参见Unary运算符部分。

  • 当我运行这个脚本时,我收到 |这在当时是出人意料的。 这是代码: 在句子中,

  • (线程:持续时间)-->(1:16)、(2,3:32)、(4,5,6,7:47)、(8,9:31)...(17,18,19,20:16) 该项目有2个项目: 工人阶层: 主类: