批处理脚本迭代形式

Batch Script Iterative form

我有一个批处理脚本:

  1. 检查目录中的文件并检查它是否存在于另一个目录中 目录,它不应该存在于那里
  2. 计算每个具有特定格式的文件,每个文件应该只有一个

如果以上两种说法都成立则生成成功文件。

下面是我的代码,运行良好:

SET /A file1=file2=Val=0
SET /A FileE=1
set /a flagname=1

for %%A in (*ABC*.txt) do set /a file1+=1
for %%A in (*XYZ*.txt) do set /a file2+=1

for %%i in ("*") do if exist "Processed\%%~nxi" SET /A FileE=0

SET /A Val=%file1%*%file2%*%FileE% 

if %Val% EQU 1 (
echo SUCESS>Sucess.txt 
SET Flag=Sucess
echo %Flag%) else (

if %file1% EQU 0 ( echo Missing ABC.txt files >> Error.txt) 
if %file1% GTR 1 ( echo More than 1 ABC.txt files >> Error.txt) 

if %file2% EQU 0 ( echo Missing XYZ.txt files >> Error.txt) 
if %file2% GTR 1 ( echo More than 1 XYZ.txt files >> Error.txt)

(for %%i in ("*") do if exist "Processed\%%~nxi" echo(File Exists in 
Processed 
Folder %%~i)>>Error.txt
SET Flag=FAILURE
echo %Flag%) 

我的问题是如何将上面的代码转换为遍历一个包含 100 个文件的列表?下面是我试过的代码:

@echo off
setlocal enable delayed expansion
Set Filen[0]=ABC*.txt
Set Filen[1]=XYZ*.txt
SET /A Val=1 
SET /A File1=0

FOR /l %%G in (0,1,1) Do (
echo !Filen[%%G]! hi
set File1=0
echo %file1% Count
for %%A in (!Filen[%%G]! ) do (
set File1=!File1!+1
echo %%A %file1%)
)

将您的搜索词放入一个字符串中并对其进行迭代:

Set "Search=ABC DEF XYZ"
For %%A in (%Search%) do (

或者在一个文件中,一个一个地阅读

For /f "usebackq" %%A in ("Search.txt") Do (

有了这个文件Search.txt

ABC
DEF
XYZ

环境中

> tree a:\ /F
Auflistung der Ordnerpfade für Volume RamDisk
A:\
└───Test
    │   ABC_123.txt
    │   DEF_456.txt
    │   Search.txt
    │
    └───Processed

下一批

:: Q:\Test18\SO_51120147.cmd
@Echo off & Setlocal EnableDelayedExpansion
Set "BaseDir=A:\Test"
Set Err=^>^> "Error.txt" Call Echo=[%%date%% %%time%%] 
PushD "%BaseDir%" || (%Err% can't locate %BaseDir% & Pause &Goto :Eof)
%Err% Job %~f0 started by %USERNAME%
Set " Flag=Sucess"
:: Uncomment for string variant
:: Set "Search=ABC DEF XYZ"
:: For %%A in (%Search%) do (

:: use the file variant
For /f "usebackq" %%A in ("Search.txt") Do (
    Set Cnt=0
    For %%B in (%%A*.txt) Do Set /A Cnt=1
    if !Cnt! NEQ 1  (
      %Err% Count of %%A*.txt file=[!Cnt!]
      SET Flag=FAILURE
  )
)
For %%A in (*) do if exist "Processed\%%~nxA" (
    %Err% File %%A does exist in Processed Folder
  Set Flag=FAILURE
)
%Err% Job %~f0 terminated with %Flag%

产生这个输出:

> type A:\Test\Error.txt
[2018-07-01 13:10:34,43]  Job Q:\Test18\SO_51120147.cmd started by LotPings
[2018-07-01 13:10:34,45]  Count of XYZ*.txt file=[0]
[2018-07-01 13:10:34,47]  Job Q:\Test18\SO_51120147.cmd terminated with FAILURE

编辑:有点棘手的行的解释:

Set Err=^>^> "Error.txt" Call Echo=[%%date%% %%time%%] 

不必 pre/append 应该进入错误日志的每一行
重定向和(固定的)文件名我把它们和
放在一起 echo 命令和 [date time] 标记到变量中。

为了避免在设置变量时立即解释,“>”必须 用插入符转义,并延迟 % 符号的扩展 加倍。 (否则每个日志条目都有相同的日期时间)

在需要回显(伪)调用时强制扩展日期时间。