批处理循环记住循环后的每个变量并执行操作

时间:2020-10-29 17:28:11

标签: for-loop batch-file

这不是一个可行的示例,但是:

@echo off
for /f tokens^=1^ delims^=^ eol^= %%a in ('dir /B /A:-D "file_*.*_b.txt"'
) do for /F Tokens^=1-2^ Delims^=_^ EOL^= %%c in ('dir /B /A:-D "file_*.*_b.txt"'
) do for /F Tokens^=1-3^ Delims^=.^ EOL^= %%e in ("%%d") do (
echo Filename=%%a Version=%%d
)
pause

我的文件列表是:

file_10.1_b.txt
file_10.0.1_b.txt

我希望我的for循环记住每个文件,并删除文件名中版本号最低的文件。因此,我希望它循环浏览这两个,并删除版本号最低的一个。因此,%%a应该是整个文件名,%%d应该是与文件名隔离的版本。我想保留它检测到的文件版本以匹配文件名,并删除文件版本最低的文件名。

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q64587141.txt"

set "highest=0.0.0"
FOR /f "tokens=3delims=_" %%a IN ('findstr /L /c:"iPhone_4.7" "%filename1%"') DO (
call :sethighest %%a
)
echo highest is %highest%
GOTO :EOF

:sethighest
for /f "tokens=1,2,3delims=." %%c in ("%1") do for /f "tokens=1,2,3delims=." %%s in ("%highest%") do (
 if %%s gtr %%c goto :eof
 if %%s lss %%c goto setnew
 rem version is same; check subversion
 if "%%t"=="" goto setnew
 if "%%d"=="" goto :eof
 if %%t gtr %%d goto :eof
 if %%t lss %%d goto setnew
 rem subversion is same; check sub-subversion
 if "%%u"=="" goto setnew
 if "%%e"=="" goto :eof
 if %%u gtr %%e goto :eof
)
:setnew
set "highest=%1"
goto :eof

这是您原始问题的答案。

我将您的版本号测试放入文件中,并像findstr一样使用dir对其进行过滤。

您提取了版本,只需要使用.作为分隔符进行比较,并在缺少级别时采取适当的措施即可。

如果想要最低的设置,只需要调整比较子例程即可,以99.99.99作为初始设置。

答案 1 :(得分:0)

这看起来有些复杂,但这是一个删除两个文件中至少一个的工作示例,第二个文件是较新的,但是唯一标识其使用期限的方法是通过文件名本身中的版本号。它确实记住了该变量,但是不幸的是,我仍然必须重新检索代码中的最早文件才能删除它。我无法为每个循环将文件名信息保存到变量中,但是希望这对某人很方便。

编辑:也许这对某人有用,但是我把它做成一个循环,可以对目前的所有iPhone进行此操作。

@echo off
setlocal EnableDelayedExpansion

set ipmodel=0
:iptype
echo %ipmodel%
if "%ipmodel%"=="0" goto :ip6s
if "%ipmodel%"=="1" goto :ip6sp
if "%ipmodel%"=="2" goto :ip7
if "%ipmodel%"=="3" goto :ip7p
if "%ipmodel%"=="4" goto :ipx
if "%ipmodel%"=="5" goto :ipxr11
if "%ipmodel%"=="6" goto :ipxs11p
if "%ipmodel%"=="7" goto :ipse2
if "%ipmodel%"=="8" goto :ip12m
if "%ipmodel%"=="9" goto :ip12
if "%ipmodel%"=="10" goto :ip12p
if "%ipmodel%"=="11" goto :ip12pm
if "%ipmodel%"=="12" goto :eof
:ip6s
set ipstart=0
set "token2var=3-4"
set "iphonevar=iPhone_4.7_"
set "token3var=2"
goto :ipbegin
:ip6sp
set ipstart=0
set "token2var=3-4"
set "iphonevar=iPhone_5.5_"
set "token3var=2"
goto :ipbegin
:ip7
set ipstart=0
set "token2var=3-4"
set "iphonevar=iPhone_4.7_P3_"
set "token3var=2"
goto :ipbegin
:ip7p
set ipstart=0
set "token2var=3-4"
set "iphonevar=iPhone_5.5_P3_"
set "token3var=2"
goto :ipbegin
:ipx
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone10,3,iPhone10,6_"
set "token3var=1-3"
goto :ipbegin
:ipxr11
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone11,8,iPhone12,1_"
set "token3var=1-3"
goto :ipbegin
:ipxs11p
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone11,2,iPhone11,6,iPhone12,3,iPhone12,5_"
set "token3var=1-3"
goto :ipbegin
:ipse2
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone12,8_"
set "token3var=1-3"
goto :ipbegin
:ip12m
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone13,1_"
set "token3var=1-3"
goto :ipbegin
:ip12
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone13,2_"
set "token3var=1-3"
goto :ipbegin
:ip12p
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone13,3_"
set "token3var=1-3"
goto :ipbegin
:ip12pm
set ipstart=0
set "token2var=1-4"
set "iphonevar=iPhone13,4_"
set "token3var=1-3"
goto :ipbegin
:ipbegin
if "!ipstart!"=="2" goto :ipskip
set files=0
for /F Tokens^=1-4^ Delims^=^ EOL^= %%T in ('dir /B /A:-D^
 "%AppData%\Apple Computer\iTunes\iPhone Software Updates\%iphonevar%*.*_*_Restore.ipsw"'
) do (
    if "%thevar%"=="1" goto :eof
    set /a files=!files! + 1
    set var!files!=%%T
    for %%i in (!files!) do (call :setvar !var%%i!)
)
goto :eof
:setvar
set "file=%1"
for /F Tokens^=%token2var%^ Delims^=_^ EOL^= %%G in ('dir /B /A:-D^
 "%AppData%\Apple Computer\iTunes\iPhone Software Updates\%iphonevar%*.*_*_Restore.ipsw"'
) do for /F Tokens^=%token3var%^ Delims^=.^ EOL^= %%K in ("%%H") do (
    set "version=%%H"
    if "ipmodel"=="0" echo !version!
    if not "%version%"=="" (
        if "!version!" LSS "%version%" (
            for /F Tokens^=1-4^ Delims^=^ EOL^= %%P in ('dir /B /A:-D^
 "%AppData%\Apple Computer\iTunes\iPhone Software Updates\%iphonevar%*.*_*_Restore.ipsw"'
            ) do (
                set "thevar=1"
                del /f /q "%%P"
                goto :eof
            )
        )
    )
)
set /a ipstart+=1
goto :ipbegin
:ipskip
set /a ipmodel+=1
goto :iptype