批处理脚本找不到序列号

时间:2012-07-12 15:00:12

标签: batch-file

我是批处理脚本的新手,

我以格式获取源文件 ABC_CDEFG_HIJK_20120712105523_000001(时间戳和序号都不会改变) 它可以是每30分钟一个文件或多个文件。 我需要查看列表中是否有任何丢失的sequnece no并向用户发送警报。 任何人都可以帮助我。

提前致谢。

3 个答案:

答案 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