繁体   English   中英

此批处理中不期望goto

[英]goto was not expected at this time batch

@echo off
:start
set string=
set lo=1
set a=0
set b=0
set cl=1
set cloop=
set google=0
set k=0
set r=0
set id=
set t=0
set f=0

set /p string=? 
if defined string (
echo %string%
goto loop
) else (
echo please enter a string
goto start
)
:loop
set a=
for /f "tokens=%lo%" %%G IN ("%string%") DO echo %%G 
if defined a (
echo %a%
set google=0
set /p cloop=<greetings.txt
pause
:cloop
set b=
for /f "tokens=%cl%" %%g IN ("%cloop%") DO set b=%%g
if defined string (
if %a%==%b% goto greetings
set /a cl=%cl%+1
goto cloop
) else (
set cl=0
set /a lo=%lo%+1
goto loop
)
) else (
goto google
)
:greetings
set f=0
set k=0
set r=0
set /p id=<greetingtone.dat
for /f "tokens=%cl%" %%g IN ("%id%") DO set t=%%g
start greeting.bat
call greeting.bat
goto talk
:google
echo not done yet
pause
goto start

如果我删除它时%a%==%b%进入问候语,我将其范围缩小到了这一行
我看过了,但我不知道为什么它不起作用, 请帮助 greetings.txt发出“嗨你好咕“声”,我认为这可能是变量

如果%a%%b%为空值,则可能是比较未完成,并且表示尚未实现goto 例如,如果在C:\\提示符下键入以下内容:

c:\>if a== echo ok

c:\>if ==a echo ok
echo was unexpected at this time.

c:\>if == echo ok
ok was unexpected at this time.

c:\>

如果将每个值都用引号引起来,则即使其中一个或两个值都为空,比较仍然可以进行。 例如:

if "%a%"=="%b%" goto greetings

IF语句中出现意外单词的正常原因是IF具有非常特定的语法,即IF item1 operator item2 actionstatement(s)

可能发生的情况是item1 item2似乎丢失了,因此IF将其解析为IF == goto greetings 由于goto不是其已知的operators==equneqleqlssgeq ,gtr`),因此会抱怨。

这里的问题是-为什么%a%%b%似乎为空?

在块语句(a parenthesised series of statements) ,将分析整个然后执行。 解析该块时-执行该块之前,该块中的任何%var%都将由该变量的值替换。

因此,将在遇到IF时使用%variables%的值执行IF (something) else (somethingelse) 在您的情况下,这表示最外的IF if defined string

解决此问题的两种常用方法是:1)使用setlocal enabledelayedexpansion和使用!var! 代替%var%访问的改变值var或2),以调用一个子程序使用改变的值来执行进一步的处理。

下一个问题是在块中使用标签。 这不是一个好主意。 在某些版本中,标签会终止该块。 而是调用子例程。

 call :cloop

...
goto start
:cloop
 (whatever needs to be done)
goto :eof

(请注意:cloop:EOF具有必需的冒号。在cloop上表示“这是一个内部子例程-位于当前批处理文件中。” :EOFCMD理解end of file预定义标签。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM