Or you could just use a config file. Many programming languages use something like a .csproj or .toml or whatever which is merely a fancy way of writing CLI arguments for the compiler that will be invoked during the build process; for a random executable it can be even simpler, just write a tiny library that parses a plaintext string into arguments and include it in each of your programs. You can even store multiple configs in one file this way, separated by linebreaks or whatever you choose.
foo.exe
foo.config
foo.config contents:
--flag1 --flag3
--flag2 --flag5 some_param
run: `foo.exe --config 2`Compared to shell scripts, this is a portable solution that will work across different environments, and compared to including arguments in filenames, it's not insane and doesn't require duplicating the entire binary to maintain multiple configs. The only merit I see to the filename approach is that it gives you a single file instead of two (if you have exactly one config), but I don't think that tradeoff is worth it.
And you can then set things like "open with" if you want click -> launch with specific app.
The biggest thing for me is that you can name the configurations for what they're doing not how.
For example:
> fetch---api.github.com---repos/owner/project---q=stars>100---o=json.exe
could become something like
top_starred_repos.bat/exe/sh
This also removes the need to get myself and others to battle escaping problems as you start adding arbitrary arguments into this.