检查FOR循环内的“IF”条件(批处理/ cmd)

时间:2009-07-22 08:51:04

标签: batch-file

我需要在Windows批处理文件中实现的代码是这样的(它目前在Perl中):

while(<file>)
{
   if($_ =~ m/xxxx/)
   {
      print OUT "xxxx is found";
   }
   elsif($_ =~ m/yyyy/)
   {
      next;
   }
   else
   {
      ($a,$b) = split(/:/,$_);
      $array1[$count] = $a;
      $array2[$count] = $b;
      $count++;
   }
}

我的问题是:

  1. Windows批处理文件中是否存在这种复杂程度?
  2. 如果是这样,我该如何设置If条件 在for循环中读取文本 文件?
  3. 感谢您的关注。如果您知道答案,或者有任何关于如何找到答案的想法/线索,请分享。

    编辑:我在Windows工作。我只能使用Windows默认提供的任何内容,这意味着我无法使用Unix实用程序。

6 个答案:

答案 0 :(得分:9)

if放入for一般很容易:

for ... do (
    if ... (
        ...
    ) else if ... (
        ...
    ) else (
        ...
    )
)

可以使用for开关编写遍历行的/f循环:

for /f "delims=" %%s in (*.txt) do (
    ...
)

正则表达式由findstr提供。如果没有提供输入文件,它将与stdin匹配。您可以将输出重定向到NUL,以便它不显示找到的字符串,只需使用其errorlevel来查看它是否匹配(0表示匹配,非0表示它不匹配)。您可以再次使用/f拆分字符串。所以:

set count=0
for /f "delims=" %%s in (foo.txt) do (
    echo %%s | findstr /r xxxx > NUL
    if errorlevel 1 (
        rem ~~~ Didn't match xxxx ~~~
        echo %%s | findstr /r yyyy > NUL
        if errorlevel 1 (
            rem ~~~ Didn't match yyy ~~~
            for /f "delims=; tokens=1,*" %%a in ('echo %%s') do (
                 set array1[!count!]=%%a
                 set array2[!count!]=%%b
                 set /a count+=1
            )
        )
    ) else (
        echo XXX is found
    )
)

答案 1 :(得分:2)

我认为这对CMD.EXE来说太痛苦了,甚至完全不可能,尽管我可能在最后一个错误。

最好使用WSH(Windows Scripting Host),它允许您使用JScript或VbScript,并且几乎存在于每个系统中。 (如果需要,您可以提供可再发行的)

答案 2 :(得分:1)

这是一个与你的Perl脚本相当的粗略的vbscript。

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
Set objFile = objFS.OpenTextFile(strFile)
Dim array1()
Dim array2()
count=0
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    If InStr(strLine,"xxxx") >0 Then
        WScript.Echo " xxxx is found."
    Else
        s = Split(strLine,":")
        ReDim Preserve array1(count)
        ReDim Preserve array2(count)
        array1(count)=s(0)
        array2(count)=s(1)
        count=count+1
    End If 
Loop
'print out the array elements
For i=LBound(array1) To UBound(array2)
    WScript.Echo array1(i)
    WScript.Echo array2(i)
Next

为了您的信息,您可以使用Windows的Perl,而无需学习其他语言。

答案 3 :(得分:1)

我没有使用perl的经验,但如果我理解你的命令,就会是这样的。请注意,批处理脚本非常原始,并且它没有任何好的方法进行清理,因此某些字符(主要是&amp; |&lt;&gt;)会将其分解为碎片。

@ECHO OFF
SETLOCAL
SET COUNT=0
FOR /F "DELIMS=" %%A IN ('file') DO CALL :SCAN %%A
:SCAN
ECHO %*|FIND "xxxx">NUL
IF %ERRORLEVEL%==0 ECHO xxxx is found&GOTO :EOF
ECHO %*|FIND "yyyy">NUL
IF %ERRORLEVEL%==0 GOTO :EOF
FOR /F "TOKENS=1,2 DELIMS=:" %%A IN ('ECHO %*') DO SET ARRAY1[%COUNT%]=%%A&SET ARRAY2[%COUNT%]=%%B
SET /A COUNT+=1

如果使用FINDSTR而不是FIND,则可以使用regexp。如果你想使用ARRAY1 [%COUNT%]的值(里面有一个变量),你必须用“SETLOCAL ENABLEDELAYEDEXPANSION”替换“SETLOCAL”并使用!ARRAY1 [%COUNT%]!

PS:我没有测试过这个脚本,但据我所知它应该可以工作。

答案 4 :(得分:0)

您可以将Perl程序转换为不需要perl {。{}}的.exe(甚至可以进行加密)。最好使用PAR::Packer来处理PAR :: Packer,但也可以使用ActivePerl。

答案 5 :(得分:0)

这是可能的!

{{1}}