我是批处理脚本的新手,
我正在获取格式为 ABC_CDEFG_HIJK_20120712105523_000001 的源文件(时间戳和序列都不会改变)它可以是单个文件或每 30 分钟的多个文件。我需要找出列表中是否缺少任何序列号并向用户发送警报。谁能帮我这个。
提前致谢。
我是批处理脚本的新手,
我正在获取格式为 ABC_CDEFG_HIJK_20120712105523_000001 的源文件(时间戳和序列都不会改变)它可以是单个文件或每 30 分钟的多个文件。我需要找出列表中是否缺少任何序列号并向用户发送警报。谁能帮我这个。
提前致谢。
假设没有扩展,
@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
我已经测试了以下内容,并且可以正常工作。(我的原始代码没有测试最后一个基本文件名。此代码已修复)
此版本以 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
这是另一个使用较少代码的版本(也经过测试和工作)。它以字母顺序遍历文件并构造一个变量,其名称中的基本名称和序列号作为值。星号用于分隔名称和值的部分。使用了一些技巧,以便=
文件名中的 a 不会破坏代码。但是,如果名称中包含多个基本名称=
,则它们必须在 之前进行区分,否则=
只会测试这些名称中的一个。
循环完成后,每个基本名称都有一个变量,其值中具有最大序列号。第二个循环迭代并将变量解析为基本名称和最大序列号,然后查找序列号中的间隙。
@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
)
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