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

выполнить программу 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 /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.

решение1

Зачем вы вызываете 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'

решение2

Как показывает другой ответ, вы должны иметь возможность запустить команду напрямую из командной строки Cygwin bash. Но если вы передаете аргументы file/dir, собственные программы Windows будут ожидать собственный путь Windows. Вместо того, чтобы пытаться создать такой путь вручную, вы можете использовать инструмент 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 есть /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
}

Связанный контент