2010-10-20 147 views
2

我有GOTO命令和附屬標籤的問題。與goto命令不起作用的windows批處理文件

事實:給定文件夾中的一堆文件(它們是日誌錯誤)我需要打開它們並檢查它們是否包含特定的字符串。如果是,則從文件名中刪除一些字符(最後出現「_」後的所有字符,包括它們自己)並執行其他操作。

對於一個循環的方式切斷我使用GOTO命令的字符,因爲我發現在這裏描述:http://www.robvanderwoude.com/battech_while_loops.php

的腳本是:

@echo off 
setlocal EnableDelayedExpansion 

cls 

for %%X in (D:\e-pub\outbox\logs\*.*) do (

    for /F "tokens=7" %%S in (%%X) do (

     if /i "%%S"=="<ml>" (
      SET fisier=%%~nX 
      SET cond=!fisier:~-1! 
      SET fisier=!fisier:~0,-1! 

      :loopStart 
      rem condition to break the loop 
      if !cond!==_ goto loopEnd 
      SET cond=!fisier:~-1! 
      SET fisier=!fisier:~0,-1! 
      goto loopStart 

      :loopEnd 

      rem here it should be out of a loop 
      rem other stuff to do with var !fisier! 
      rem the following line is not executed because of the label loopEnd 
      echo !fisier! 
     ) 
    ) 
) 

pause 

腳本沒有運行,因爲有標籤loopEnd後的空行?! 如果我在該標籤後面寫任何指令,它們將被執行,但是從第一個for語句開始的其餘迭代不會被執行(日誌錯誤文件夾包含更多的一個文件)

有人可以提供幫助嗎?

+0

顯示您的日誌文件樣本,包含要查找的字符串以及需要刪除的內容。顯示你想要的最終輸出。 – ghostdog74 2010-10-20 14:09:00

+0

從我的角度來看,它與內容無關,但其實現方式 – Ergil 2010-10-25 08:21:10

回答

10

你有兩個問題。

一個問題是goto打破了for-loop。另一方面,標籤在括號中相當困難。

即使goto的標籤位於同一個塊中,跳轉後立即丟失了for變量,goto也會始終中斷和所有嵌套循環。

括號內的標籤是「兩線」的! 我用標籤進行了實驗,這裏有一些括號的結果。

當出現標籤時,下一行必須採用正確的「輔助」行格式。

這就是爲什麼這會失敗。

(
:this label fails with a syntax error 
) 

(
:this works 
:because this line is a "legal" secondary line 
) 

(
:: The remark style 
:: fails, because it's not "legal" to use a double colon, because it's not a legal path (in the most cases) 
) 

(
:and now I got courious & echo This will not echo'd 
:but & echo You can see this ! 
) 

對於第二行,跳過批解析器的某些步驟。

@不起作用@echo Hello試圖啓動一個名爲@echo.bat的文件。

括號的分割失敗,如echo(hello
將標籤作爲文件名處理,:echo僅在:echo是有效文件名時檢查,然後跳過該部分。

::hello在驅動器::上搜索。
出於測試目的,驅動器::可以使用subst :: c:\temp創建。
由於標籤在第二行中被忽略,所以&符號和管道也可以工作,但::上的文件必須存在。

(
echo @echo This is %~f0 
) > %TEMP%\testLabel.bat 

REM create Drive :: 
subst :: %temp% 
(
:Label 
::\testLabel.bat The bat will not be executed | echo But this 
) 
subst /D :: 
+0

有一件事。在第二個例子中,你介紹了第二個標籤。在cmd.exe的條款不會第二個標籤需要另一個「法律線」? Tnx的解釋。 – Ergil 2010-10-25 08:26:05

+0

不,如果標籤位於「輔助線」中,則不需要另外的「輔助線」。在最後一個例子中你可以看到sec-line的解析方式不同,如下所示 – jeb 2010-10-25 15:08:53

+0

謝謝你的回答和你的時間 – Ergil 2010-10-25 20:15:39