I'm fighting a head code today so I hope I can muddle my way through this.
First off FWIW if it were me I'd do it the way you do not want to do it by assigning a button to each external command line program. That's actually the way I do it and have quite a number of buttons set up that way and they work very well for me.
But to address the way you want to do it, to solve the problem I'd go this route. By the way this assumes you are using at least Windows NT or a newer version of Windows, my suggestion below will not work on a Windows 98 or older system.
I'd still use a batch file to do this, but only one, and here is why I'd use that batch file. You need something in between the Opus button and the external command line programs to parse the code. To manipulate it into what you want it to be as you're running into the unavoidable roadblock of how Windows parses double quotes.
So starting with the following example button code to launch one universal batch file:
<?xml version="1.0"?>
{441626D7-0C39-4E9D-9631-F21D731B0C2A}
Test.bat
Test
C:\WINNT\System32\shell32.dll,71
D:\Mine\cmd\Test.bat "{dlgstring|Enter Parameters|c:\temp ''}" {f}
Notice it is set to run as an MSDOS batch function. That is so only one program will be launched in the event you happen to have more than one program selected.
Notice I used {f} instead of your original {f!}, that is to prevent anything from happening should you push the button when nothing is selected.
Notice I enclosed the arguments within double quotes. That is necessary to keep the arguments together.
Notice the arguments come before the selected program. That is because Opus processes the dialog box before it does anything else.
Also notice in the button dialog box parameters, I used single quotes (C:\temp '') instead of double quotes (C:\temp ""). Why? To get around the way Windows parses double quotes. By initially substituting single quotes for double ones. The trick is once you have your arguments in the batch file, to replace the single quotes with double ones before passing the arguments on to your external command line programs.
Now below is the D:\Mine\cmd\Test.bat batch file:
@echo off
rem Get Entered Arguments less double quotes
set ARG=%~1
rem replace any single quotes with double quotes
set ARG=%ARG:'="%
shift
echo The arguments are: %ARG%
echo:
echo The program is: %1
pause