execute o programa Windows com parâmetros do cygwin

execute o programa Windows com parâmetros do cygwin

Quero executar um programa do Windows no console cygwin. Tentei vários formulários, mas não encontrei a sintaxe correta.

 $ 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.

Responder1

Por que você está invocando o cmd? Esse é um nível extra de complexidade que você parece não precisar. Você pode invocar o programa do Windows diretamente do bash:

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

ou

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

ou qualquer outra forma de citar em sh.

Se você precisar invocar o cmd, talvez seja necessário passar o código cmd na entrada padrão ou em um arquivo em lote, em vez de with /c, porque /canalisa aspas de uma maneira diferente (o que não faz sentido para mim). Isso seria

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

Responder2

Como a outra resposta indica, você poderá executar o comando diretamente do prompt do Cygwin bash. Mas se você estiver passando argumentos file/dir, os programas nativos do Windows esperarão um caminho nativo do Windows. Em vez de tentar construir esse caminho manualmente, você pode usar a cygpathferramenta:

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

Outra armadilha potencial a ser observada é que você pode ter valores diferentes entre o Windows e o Cygwin para determinadas variáveis ​​de ambiente comuns, como HOME ou TEMP. Este não é um problema tão comum, mas se você suspeitar que esse pode ser o caso, passe as definições do Windows antes do comando. Isso iniciará o programa com um ambiente contendo o valor substituído. Por exemplo, TEMP está /tmpno Cygwin, mas é bem diferente no Windows, então se isso estiver causando problemas, você poderá acabar com algo como:

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

Finalmente, certifique-se de citar quaisquer argumentos que contenham espaços incorporados.

Como observação lateral, tenho alguns scripts wrapper com alias de determinados programas do Windows que me permitem inserir argumentos no estilo Cygwin. Os wrappers e, em seguida, usam algo como esta função para converter os argumentos no formato pronto para Windows antes de passá-los para o aplicativo nativo:

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

informação relacionada