Looping is time consuming. If you expect that the filenames are created consecutively you can do it like this:
for /f %%a in ('dir /b bps*.txt^|find /c /v ""') do set /a next=%%a bps -f bps%next%.txt
The for command here is NOT used to loop - it merely saves the output of the command in apostrophes in the %%a variable. With dir we list the existing files with that name pattern, the find command counts them. So if you already have 2 files of that name the output will be "2".
Different to your example the very first file will be named "bps0.txt", not "bps.txt". If you want to avoid this, use this instead:
for /f %%a in ('dir /b bps*.txt^|find /c /v ""') do set /a next=%%a if %next% EQU 0 (set bps=bps) else (set bps=bps%next%) bps -f %bps%.txt