I've had some luck implementing such things via a lock file, registry entry, or environment variable. Any of these can work, depending on how much communication you need between processes. When the batch file launches, it needs to check to see if there is an existing lock, and if not, set a lock with it's PID, wait 1 second and check if the PID still matches, if so, run, and delete the lock.
If there is already a lock in place, check to see if the PID still has a running process, if so, terminate. If the process has abandoned its lock file, assume that its orphaned and set a new lock. For bonus points, take into account that PIDs can be reused.
Why set the lock and wait 1 second? Well if you happen to start multiple instances of the batch file at exactly the same time, they'll both do some sort of "IF NOT ISFILE" or whatever, and then create locks that overlap. Using a file operation that blocks or locks the file so that subsequent events fail can help, especially since the OS will clean up the read-locks on the .lock files for you, but every once in a while, this still fails for reasons that aren't entirely clear.
I prefer using a file over the registry because you can dump errors or other "stuff" into the lock file and when another instance runs and finds a previous lock file to be abandoned, the details can be useful for troubleshooting.
There is, of course, some non-zero overhead here, no matter what.