2010-10-20 103 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