Intereting Posts

выполнить программу windows с параметрами из cygwin

Я хочу выполнить программу Windows в консоли cygwin. Я пробовал различные формы, но я не нашел правильного синтаксиса.

$ 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 /CC:\\"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. 

Почему вы вызываете cmd? Это дополнительный уровень сложности, который вам не нужен. Вы можете вызвать программу Windows непосредственно из bash:

 'C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe' format input=sentencia.tmp output=sent_formateada.tmp 

или

 /cygdrive/c/Program\ Files/sqldeveloper/sqldeveloper/bin/sdcli.exe format input=sentencia.tmp output=sent_formateada.tmp 

или любой другой способ цитирования в sh.

Если вы должны вызывать cmd, вам может понадобиться передать код CMD на стандартный ввод или в пакетном файле, а не на /c , потому что /c анализирует кавычки по-другому (что для меня не имеет смысла). Это было бы

 cmd <<<'"C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp' 

Поскольку другой ответ указывает, что вы должны иметь возможность запускать команду непосредственно из приглашения Cygwin bash. Но если вы передаете аргументы file / dir, программы на родных окнах будут ожидать родной путь к окну. Вместо того, чтобы пытаться построить такой путь вручную, вы можете использовать инструмент cygpath :

 # Emits, for example, 'C:\Program Files\MyApp\MyApp.exe' cygpath --windows '/cygdrive/c/Program Files/MyApp/MyApp.exe' 

Еще одна потенциальная ошибка, о которой вам следует знать, может иметь разные значения между Windows и Cygwin для определенных общих переменных среды, таких как HOME или TEMP. Это не так часто встречается, но если вы подозреваете, что это может произойти, определите Windows (ы) перед командой. Это запустит программу со средой, содержащей переопределенное значение. Например, TEMP is /tmp в Cygwin, но в Windows это совсем другое, поэтому, если это вызывает проблемы, у вас может получиться что-то вроде:

 TEMP="$LOCALAPPDATA\\Temp" MyApp.exe foo bar ... 

Наконец, обязательно укажите любые аргументы, в которых есть пробелы.

В качестве побочного примечания у меня есть некоторые сценарии-оболочки, которые накладываются на определенные программы Windows, которые позволяют мне вводить аргументы типа Cygwin. Обертки, а затем используйте что-то вроде этой функции, чтобы преобразовать аргументы в готовый формат Windows, прежде чем передавать их в собственное приложение:

 # 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 }