我是批处理脚本的新手,
我以格式获取源文件 ABC_CDEFG_HIJK_20120712105523_000001(时间戳和序号都不会改变) 它可以是每30分钟一个文件或多个文件。 我需要查看列表中是否有任何丢失的sequnece no并向用户发送警报。 任何人都可以帮助我。
提前致谢。
答案 0 :(得分:1)
假设没有延期,
@echo off
setlocal enabledelayedexpansion
for /l %%a in (1,999999,1) do (
set test1=000000%%a
set test2=!test1:~-6!
if not exist *!test2! goto loopexit
)
:loopexit
echo %test2% missing
如果有扩展程序,请将其添加到if not exist
行,例如if not exist *!test2!.txt goto loopexit
它使用test2
来测试文件名,因为这是你没有从循环中获得的所有额外零的%a
答案 1 :(得分:1)
选项1
我测试了以下内容,它确实有效。 (我的原始代码没有测试最后一个基本文件名。此代码已修复)
此版本以alpha顺序循环浏览文件并记住先前的文件名。当检测到基本名称的更改时,它会查找先前基本名称序列中的间隙。最后一个基本名称未在循环中进行测试,因此必须在循环后进行测试。
@echo off
setlocal disableDelayedExpansion
set "ext=.txt"
set "lastName="
for /f "eol=: delims=" %%F in ('dir /b /a-d *%ext% ^| findstr /irec:"_[0-9][0-9][0-9][0-9][0-9][0-9]%ext%"') do (
set "name=%%~nF"
setlocal enableDelayedExpansion
if defined lastName if "!lastName:~0,-6!" neq "!name:~0,-6!" (
for /f "delims=0" %%I in ("!lastName:~-6!") do (
for /l %%N in (1 1 %%I) do (
set "n=000000%%N"
set "test=!lastName:~0,-6!!n:~-6!!ext!"
if not exist "!test!" echo "!test!" is missing
)
)
)
endlocal
set "lastName=%%~nF"
)
setlocal enableDelayedExpansion
if defined lastname (
for /f "delims=0" %%I in ("!lastName:~-6!") do (
for /l %%N in (1 1 %%I) do (
set "n=000000%%N"
set "test=!lastName:~0,-6!!n:~-6!!ext!"
if not exist "!test!" echo "!test!" is missing
)
)
)
选项2
这是使用较少代码的另一个版本(也经过测试和工作)。它以alpha顺序循环遍历文件,并构造一个变量,其名称中的基本名称和序列号作为值。星号用于分隔名称和值的部分。使用了一些技巧,以便文件名中的=
不会破坏代码。但是,如果名称中有多个基本名称包含=
,那么它们必须在=
之前区分,否则只会测试其中一个名称。
循环完成后,每个基本名称都有一个变量,该值具有值中的最大序列号。第二个循环迭代并将变量解析为基本名称和最大序列号,然后查找序列号中的间隙。
@echo off
setlocal disableDelayedExpansion
set "ext=.txt"
for /f "delims==" %%A in ('2^>nul set file*') do set "%%A="
for /f "eol=: delims=" %%F in ('dir /b /a-d *%ext% ^| findstr /irec:"_[0-9][0-9][0-9][0-9][0-9][0-9]%ext%"') do (
set "name=%%~nF"
setlocal enableDelayedExpansion
for /f "delims=" %%A in ("file*!name:~0,-6!*=*!name:~-6!") do (
endlocal
set %%A
)
)
for /f "tokens=2,4 delims=*" %%A in ('set file*') do (
set "name=%%A"
setlocal enableDelayedExpansion
for /l %%N in (1 1 %%B) do (
set "n=000000%%N"
set "test=!name!!n:~-6!!ext!"
if not exist "!test!" echo "!test!" is missing
)
endlocal
)
答案 2 :(得分:-1)
ls -1|awk -F "_" '{print $4}'|cut -d. -f1 >seq.txt
awk 'p && p != $1 { for( i = p; i < $1; i++ ) print i; } {p = $1 + 1 }' seq.txt