0

我是批处理脚本的新手,

我正在获取格式为 ABC_CDEFG_HIJK_20120712105523_000001 的源文件(时间戳和序列都不会改变)它可以是单个文件或每 30 分钟的多个文件。我需要找出列表中是否缺少任何序列号并向用户发送警报。谁能帮我这个。

提前致谢。

4

3 回答 3

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

于 2012-07-12T17:00:40.320 回答
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

这是另一个使用较少代码的版本(也经过测试和工作)。它以字母顺序遍历文件并构造一个变量,其名称中的基本名称和序列号作为值。星号用于分隔名称和值的部分。使用了一些技巧,以便=文件名中的 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
)
于 2012-07-12T20:59:49.540 回答
-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
于 2016-03-04T15:04:03.073 回答