By taking advantage of bash's -c flag, it is possible to tell bash to open emacs on the given file(s). After converting the file paths to cygwin appropriate paths, the call is a piece of cake.
I put all this in a bat file on my path so I can call emacs from my DOS prompt at any time:
@echo off
setlocal
set TOEMACS_FILEPATHS=
REM Convert files to full cygwin paths and store in variable
:loopOnInputs
if "%1"=="" goto :callEmacs
REM Handy line for storing the output of a command in a variable
for /f "usebackq delims=" %%i in (`cygpath "%~dpnx1"`) do set ARG_CYGPATH=%%i
REM Store/append the file path in the variable we'll pass to emacs
if "%TOEMACS_FILEPATHS%"=="" (
set TOEMACS_FILEPATHS=%ARG_CYGPATH%
) else (
set TOEMACS_FILEPATHS=%TOEMACS_FILEPATHS% %ARG_CYGPATH%
)
REM Pop the argument we just read
shift
goto :loopOnInputs
REM Run emacs in a new bash shell
:callEmacs
bash -lic "emacs $*" dummy %TOEMACS_FILEPATHS%
:EOF
endlocal
While looping through the input arguments, you'll notice an interesting for loop that I'm using to pipe the output of the cygpath command to a variable. I spent a while trying to figure this out a while ago, and it's been working well for me so far. In short, it loops over every line in the command's output and sets the variable to that line. The delims option changes the delimiter used for separating the command output from spaces and tabs to the end of a line, and since the output of the cygpath command is only one line, we don't have to worry about overwriting the path when there are multiple lines.
Finally, I believe $* is interpreting my dummy argument as $0 or something similar, so that's what the dummy argument is doing there.
Enjoy!