Batch file 勾选“;如果;循环内部条件(批处理/cmd)

Batch file 勾选“;如果;循环内部条件(批处理/cmd),batch-file,Batch File,我需要在Windows批处理文件中实现的代码如下(目前是Perl): while() { 如果($\ux=~m/xxxx/) { 打印出“xxxx已找到”; } elsif($\uyyy=~m/yyyy/) { 下一个 } 其他的 { ($a,$b)=拆分(/:/,$); $array1[$count]=$a; $array2[$count]=$b; $count++; } } 我的问题是: Windows批处理文件中可能存在这种复杂程度吗 如果是,我如何设置If条件 在for循环中读取文本

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

while()
{
如果($\ux=~m/xxxx/)
{
打印出“xxxx已找到”;
}
elsif($\uyyy=~m/yyyy/)
{
下一个
}
其他的
{
($a,$b)=拆分(/:/,$);
$array1[$count]=$a;
$array2[$count]=$b;
$count++;
}
}
我的问题是:

  • Windows批处理文件中可能存在这种复杂程度吗
  • 如果是,我如何设置If条件 在for循环中读取文本 档案
  • 谢谢你的关注。如果您知道答案,或者对如何获得答案有任何想法/线索,请与他人分享


    编辑:我在Windows中工作。默认情况下,我只能使用Windows提供的任何工具,这意味着我不能使用Unix实用程序。

    我认为在CMD.EXE中执行此操作太痛苦,甚至完全不可能,尽管我可能在最后一个问题上弄错了


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

    这里是一个与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
    

    仅供参考,您可以使用Perl For windows,而无需学习其他语言。

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

    我没有使用perl的经验,但如果我正确理解了您的命令,就会是这样。请注意,批处理脚本非常原始,并且没有任何好的清理方法,因此某些字符(&|大部分)会将其拆分

    @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”替换为“SETLOCAL ENABLEDELAYEDEXPANSION”,并使用!阵列1[%COUNT%]


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

    if
    放入
    for
    通常很容易:

    for ... do (
        if ... (
            ...
        ) else if ... (
            ...
        ) else (
            ...
        )
    )
    
    可以使用
    /f
    开关编写迭代行的
    for
    循环:

    for /f "delims=" %%s in (*.txt) do (
        ...
    )
    
    regexp由
    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
        )
    )
    
    这是可能的!
    首先说明需要哪种类型的批处理。例如,BASH可以比NT的cmd.exe做得更多、更简单。您的答案决定了问题的答案。特别是您是在Win32还是UNIX环境中工作?例如,我想,使用基本windows很难进行拆分。拆分将使用
    for/f
    完成。不是很漂亮的语法,但也不是很难。嗨,谢谢你的VBScript。这似乎是一个很好的替代批次。至于windows上的perl,是的,我在windows中使用perl。但是我想要的批处理代码是为一个客户编写的,他-天知道为什么-不想在他的PC上安装perl:-)你可以安装Perl2exe并将perl脚本转换为可执行文件进行分发。-1提供VBScript实现而不是JScript(不,只是开玩笑)Minaev编写数组[!count!]而不是数组[%count%]这是因为for循环中的变量在循环执行时立即展开,因此在循环期间,计数始终被读取为0。因此,有必要使用延迟变量展开,以便在读取行时展开值。无论如何,我的警告也适用于这里:如果文件中有像|&这样的字符,批处理脚本将出现错误行为。是的,这是在批处理文件中执行此操作的方法。但这必须留给那些必须维护它的批量专家。
    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
        )
    )
    
    FOR ................. DO  (
        (YOUR_CONDITION && echo "YES" ) ||  (echo "NO")
    )