比较循环变量的当前值和先前值

时间:2014-03-26 12:54:03

标签: batch-file

在DOS批处理文件中,我遍历文件夹和子文件夹以查找* .txt文件。

 FOR /R %ROOT_IN% %%F in (*.txt) do (echo Found : %%F)

文本文件都是版本化的,并按如下方式调用: MytextA_v01,MytextA_v02,MytextA_v03等...... MytextB_v05,MytextB_v05,MytextB_v07等...

我想知道MytextA和MyTextB的最新版本是什么。

2 个答案:

答案 0 :(得分:0)

@echo off
    setlocal enableextensions enabledelayedexpansion

    set "root_in=%cd%"

    for %%a in (A B) do (
        set "found="
        for /f "tokens=1,* delims=;" %%c in (
            'cmd /q /e:on /c "for /r "%root_in%" %%b in (mytext%%a_v*) do echo %%~nb;%%~fb"^|sort /r'
        ) do if not defined found set "found=%%d"
        echo !found!
    )

对于两组文件中的每一组,这将简单地生成一个列表,在文件名称上反向排序,因此列表中的第一个元素是该组的最后一个文件。

已编辑 - 由于原始问题中指明的命名并未反映文件的真实命名,因此前一代码的过滤逻辑无法解决此问题。但搜索部分是(只要文件中的编号是连贯的,因为它似乎是“原始问题”)。因此,这是一个混合批处理/ javascript文件(另存为批处理文件)

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************
    setlocal enableextensions disabledelayedexpansion

    set "root_in=%cd%"

    for /f "tokens=1,* delims=:" %%a in (
        'cmd /q /e:on /c "for /r "%root_in%" %%z in (*_v??????????.??????????) do echo %%~nz:%%~fz"^|findstr /i /r /c:"_v[0-9][0-9]*:" ^|sort /r^|cscript //nologo //e:JScript "%~f0"'
    ) do echo %%b

    endlocal
    exit /b

@end
// **** Javascript zone *****************************************************
    var stdin=WScript.StdIn, stdout=WScript.StdOut, r=/^(.*)_[vV][0-9]+:/, previous=null, current;
    while (!stdin.AtEndOfStream){
        if (previous !== (current=(line=stdin.ReadLine()).match(r)[1])) { 
            stdout.WriteLine(line); previous = current 
        };
    };

它搜索“版本化”文件,并获取文件名部分和文件的完整路径。此列表被过滤为仅处理与“版本控制”匹配的记录,按相反顺序排序(因此最后一个版本是集合中的第一个记录),并且列表在脚本的javascript部分中过滤,仅返回第一个记录每组文件。然后在for %%a批处理部分处理此列表,回显以控制每个“版本化”文件的最后版本的完整路径。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "root_in=u:\sourcedir"
SET "target1=mytexta_v"
SET "target2=mytextb_v"
SET "nlatest1="
SET "nlatest2="
SET "flatest1="
SET "flatest2="
FOR /R %ROOT_IN% %%F in (*.txt) do (
 SET "test=%%~nF"
 SET "test=!test:%target1%=!"
 IF /i "%target1%!test!"=="%%~nF" IF /i "%%~nF" gtr "!nlatest1!" (
  SET "nlatest1=%%~nF"&SET "flatest1=%%F"
 )
 SET "test=%%~nF"
 SET "test=!test:%target2%=!"
 IF /i "%target2%!test!"=="%%~nF" IF /i "%%~nF" gtr "!nlatest2!" (
  SET "nlatest2=%%~nF"&SET "flatest2=%%F"
 )
)
ECHO latest texts are %flatest1% and %flatest2%

GOTO :EOF

(我使用U:驱动器进行测试)