Batch Script Iterative form


Batch Script Iterative form



I have a batch script which :



if both of the above statement is true then generate a success file.



Below is my code which is working fine:


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%)



My problem is how to transform above code to iterate over a list of number of files like 100 ? Below is the code which I tried :


@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%)
)





I'm not sure what you're trying to achieve, could you please clarify! My initial assessment is that all you want for your first script is this: @If Exist "Processed" For %%A In ("*ABC*.txt" "*XYZ*.txt") Do @If Exist "Processed%%A" (>>"error.txt" @Echo %%A) Else >>"success.txt" @Echo %%A. The files in error.txt will be those that are duplicated in .Processed, and those in success.txt would be those unique to the working directory, i.e. not in .Processed.
– Compo
Jul 1 at 10:30



@If Exist "Processed" For %%A In ("*ABC*.txt" "*XYZ*.txt") Do @If Exist "Processed%%A" (>>"error.txt" @Echo %%A) Else >>"success.txt" @Echo %%A


error.txt


.Processed


success.txt


.Processed




1 Answer
1



Put your search words in a string and iterate over it:


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



Or in a file and read one by one


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



With this file Search.txt


ABC
DEF
XYZ



In the environment


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

└───Processed



The following batch


:: Q:Test201871SO_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%



Yields this output:


> type A:TestError.txt
[2018-07-01 13:10:34,43] Job Q:Test201871SO_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:Test201871SO_51120147.cmd terminated with FAILURE



EDIT: Explanation of the somehow tricky line:


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



To not have to pre/append every line which should go to the error log with
the redirection and a (fixed) file name I put these together with the
echo command and a [date time] stamp into a variable.



To avoid immediate interpretation when setting the variable, the '>' have to
be esaped with a caret, and to delay the expansion of the %-signs these have
to be doubled. (otherwise each log entry had the same date time)



To force expansion of date time when echoing the (pseudo) call is neccessary.






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

How to input without newline? (Python)

C++ thread error: no type named ‘type’ MINGW

Analog for TagView in flutter