批处理脚本迭代形式
Batch Script Iterative form
我有一个批处理脚本:
- 检查目录中的文件并检查它是否存在于另一个目录中
目录,它不应该存在于那里
- 计算每个具有特定格式的文件,每个文件应该只有一个
如果以上两种说法都成立则生成成功文件。
下面是我的代码,运行良好:
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] 标记到变量中。
为了避免在设置变量时立即解释,“>”必须
用插入符转义,并延迟 % 符号的扩展
加倍。 (否则每个日志条目都有相同的日期时间)
在需要回显(伪)调用时强制扩展日期时间。
我有一个批处理脚本:
- 检查目录中的文件并检查它是否存在于另一个目录中 目录,它不应该存在于那里
- 计算每个具有特定格式的文件,每个文件应该只有一个
如果以上两种说法都成立则生成成功文件。
下面是我的代码,运行良好:
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] 标记到变量中。
为了避免在设置变量时立即解释,“>”必须 用插入符转义,并延迟 % 符号的扩展 加倍。 (否则每个日志条目都有相同的日期时间)
在需要回显(伪)调用时强制扩展日期时间。