Quiero ejecutar un programa de Windows en la consola Cygwin. He probado varias formas pero no encuentro la sintaxis correcta.
$ cmd /C "C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe format input=sentencia.tmp output=sent_formateada.tmp"
"C:\Program" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
$ cmd /C "C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp
format input=<archivo o directorio de entrada> output=<archivo o directorio de salida>
$ cmd /C C:\\"Program Files"\\sqldeveloper\\sqldeveloper\\bin\\sdcli.exe format input=o:\\Mezcla\\Scripts\\Oracle\\Informes_HTML\\TMP\\sentencia.tmp output=o:\\Mezcla\\S cripts\\Oracle\\Informes_HTML\\TMP\\sent_formateada.tmp
Error en input=o:\Mezcla\Scripts\Oracle\Informes_HTML\TMP\sentencia.tmp output=o:\Mezcla\Scripts\Oracle\Informes_HTML\TMP\sent_formateada.tmp
format input=<archivo o directorio de entrada> output=<archivo o directorio de salida>
Comando terminado.
Respuesta1
¿Por qué invocas cmd? Ese es un nivel adicional de complejidad que no parece necesitar. Puedes invocar el programa de Windows directamente desde bash:
'C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe' format input=sentencia.tmp output=sent_formateada.tmp
o
/cygdrive/c/Program\ Files/sqldeveloper/sqldeveloper/bin/sdcli.exe format input=sentencia.tmp output=sent_formateada.tmp
o cualquier otra forma de citar en sh.
Si debe invocar cmd, es posible que deba pasar el código cmd en la entrada estándar o en un archivo por lotes en lugar de hacerlo con /c
, porque /c
analiza las comillas de una manera diferente (lo cual no tiene sentido para mí). Eso sería
cmd <<<'"C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp'
Respuesta2
Como indica la otra respuesta, debería poder ejecutar el comando directamente desde el símbolo del sistema bash de Cygwin. Pero si pasa argumentos de archivo/directorio, los programas nativos de Windows esperarán una ruta nativa de Windows. En lugar de intentar construir dicho camino a mano, puedes utilizar la cygpath
herramienta:
# Emits, for example, 'C:\Program Files\MyApp\MyApp.exe'
cygpath --windows '/cygdrive/c/Program Files/MyApp/MyApp.exe'
Otro posible problema a tener en cuenta es que puede tener valores diferentes entre Windows y Cygwin para ciertas variables de entorno comunes, como HOME o TEMP. Este no es un problema tan común, pero si sospecha que este puede ser el caso, pase las definiciones de Windows antes del comando. Eso iniciará el programa con un entorno que contiene el valor anulado. Por ejemplo, TEMP está /tmp
en Cygwin pero es bastante diferente en Windows, por lo que si esto causa problemas, podría terminar con algo como:
TEMP="$LOCALAPPDATA\\Temp" MyApp.exe foo bar ...
Finalmente, asegúrese de citar cualquier argumento que tenga espacios incluidos.
Como nota al margen, tengo algunos scripts contenedores con alias de ciertos programas de Windows que me permiten ingresar argumentos de estilo Cygwin. Los contenedores y luego usan algo como esta función para convertir los argumentos al formato listo para Windows antes de pasarlos a la aplicación nativa:
# Process positional params, converting file path to Windows format
# and adding quotes around other params if they contain spaces. Result
# saved in array named WINFILEARGS. Call Windows app with single
# arg "${WINFILEARGS[@]}"
make_win_file_args() {
declare -ga WINFILEARGS
local SPACEREGEX="[[:alnum:]]+[[:space:]]+[[:alnum:]]+"
local index=0
for posparam ; do
currparam="$posparam"
if [[ -e $currparam ]]; then
# Convert unix paths from command line to windows paths
currparam="\"$(cygpath -w "${posparam}")\""
elif [[ $currparam =~ $SPACEREGEX ]]; then
# Quote non-file parameters that contain spaces
currparam="\"${currparam}\""
fi
WINFILEARGS[$index]="$currparam"
(( index=$index+1 ))
done
}