2014-01-18 94 views
0
@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有「喜你好咕嚕」 我認爲這可能是變量轉到此時被批

回答

1

IF語句中的正常理由,一個意外的話,就是IF有一個非常特殊的語法,IF item1 operator item2 actionstatement(s)

什麼是可能發生的是,物品1 ITEM2似乎丟失,所以IF解決了作爲IF == goto greetings。由於goto不是其已知的operators==equ,neq,leq,lss,geq,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這意味着什麼。「這是一個內部子程序 - 它在cuurrent批處理文件。」 :EOFCMD瞭解預定義的標籤意味着end of file。)

2

如果%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 
+0

+1,您診斷出OP的具體問題,但代碼還存在其他問題,例如只需添加引號就不會修復代碼。看到Magoo的回答。 – dbenham