Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 比较循环变量的当前值和以前的值_Batch File - Fatal编程技术网

Batch file 比较循环变量的当前值和以前的值

Batch file 比较循环变量的当前值和以前的值,batch-file,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的最新版本是什么 @echo off setlocal enableextensions

在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的最新版本是什么

@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文件(另存为批处理文件)

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

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
设置“root\u in=u:\sourcedir”
设置“target1=mytexta_v”
设置“target2=mytextb_v”
设置“nlatest1=”
设置“nlatest2=”
设置“最平坦的1=”
设置“最平坦的2=”
对于(*.txt)中%%F中的/R%ROOT_(
设置“test=%%~nF”
设置“测试=!测试:%target1%=!”
如果/i“%target1%!test!”=“%%~nF”如果/i“%%~nF”gtr”!nlatest1!”(
设置“nlatest1=%%~nF”并设置“flatest1=%%%F”
)
设置“test=%%~nF”
设置“测试=!测试:%target2%=!”
如果/i“%target2%”!测试!”=“%%~nF”如果/i“%%~nF”gtr”!nlatest2!”(
设置“nlatest2=%%~nF”并设置“flatest2=%%F”
)
)
回显最新文本为%flatest1%和%flatest2%
后藤:EOF

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

这太依赖于文件是A或B的事实。很抱歉,前面有误导,但文件可以像“anything_v12.txt”一样调用。这就是我最初开始遍历*.txt的原因。非常感谢更新。@user3464224,您是否至少尝试从已知的列表集中检索列表中的最后一个文件,或者它是否需要自动适应磁盘中现有的文件集?它确实需要自动适应每个文件集以查找最后的版本号。集合的基本名称可以是“任何东西”。@user3464224,应答中的更新代码。请参见“已编辑”部分。根据需要调整。这太依赖于文件是A或B这一事实。很抱歉,前面有误导性,但文件可以像“anything_v12.txt”一样调用。这就是我最初开始遍历*.txt的原因。非常感谢。
@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 
        };
    };