'Batch File to execute all .exe in a folder with count

I have quite a few exe files, I want to run them with a single batch file. As far as I understand, these two codes work for me;

for %%a in ("\*.exe") do start "" "%%\~fa"

for %%i in (\*.exe) do start "" /b "%%i"

But that cmd screen closes when all files are run. What I want is this: That cmd screen will not close when the process is finished and will show me the result (counting if possible), a code that can count how many of these .exe files work and how many fail.

So for example; 87 files blocked 13 files could not be blocked Something like this? Is this possible?



Solution 1:[1]

Maybe you can get an inspiration from this batch below. It works through program exit code. It spawns all executable, wait for their completion, then count how much failed / succeeded. It should also work with well-designed GUI program, not only command-line based ones.

It's a rough/basic answer, you may need to refine it according to your exact needs.

@echo off
setlocal enableextensions enabledelayedexpansion

REM Use marker files for getting results.
set OK_EXT=.SUCCESS
set FAIL_EXT=.FAILURE

REM Purge all possible marker files.
del /q *!OK_EXT! *!FAIL_EXT! > NUL 2>&1
set /a count=0
REM Parse all executables
for %%E in (*.exe) do (
    echo Launching: %%~nxE
    REM Create two marker files for each executable.
    echo.>%%~nE!OK_EXT!
    echo.>%%~nE!FAIL_EXT!
    REM Start the executable, delete the WRONG marker.
    REM I would have prefered to use "touch" to create the good one instead, but not standard on Windows.
    start %comspec% /C "%%~nxE && ( del /q %%~nE!FAIL_EXT! ) || ( del /q %%~nE!OK_EXT! )"
    set /a count +=1
)
REM Now, "count" contains the number of executables launched.
echo All processes launched.
echo.
:loop
echo Waiting for results...
set /a curr=0
REM Simply count the number of marker files. Must be equal to "count" when everything is finished.
for /F "usebackq tokens=*" %%C in (`dir /b *!OK_EXT! *!FAIL_EXT!`) do (
    set /A curr+=1
)
if !curr! GTR !count! (
    set /a curr-=!count!
    echo    Still !curr! processes running...
    timeout /t 2
    goto :loop
)
echo All results found.
echo.
echo Parsing results...
set /a ok_exe=0
set ok_exe_list=
set /a fail_exe=0
set fail_exe_list=
REM Parse all marker files.
for /F "usebackq tokens=*" %%C in (`dir /b *!OK_EXT! *!FAIL_EXT!`) do (
    REM And set counters + list according to the marker file type (OK or FAILED).
    if /I "%%~xC"=="!OK_EXT!" (
        set /A ok_exe+=1
        set ok_exe_list=!ok_exe_list! %%~nC
    ) else (
        set /A fail_exe+=1
        set fail_exe_list=!fail_exe_list! %%~nC
    )
)
REM Simple display.
echo Programs without error: !ok_exe!/!count!
echo    !ok_exe_list!
echo.
echo Programs with error: !fail_exe!/!count!
echo    !fail_exe_list!
echo.
goto :eof

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Wisblade