executa o programa do windows com parâmetros do cygwin

2

Eu quero executar um programa do windows no console cygwin. Eu 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.
    
por estonolose 27.05.2017 / 21:32

2 respostas

1

Por que você está invocando o cmd? Esse é um nível extra de complexidade que você não parece 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 maneira de citar em sh.

Se você precisar invocar cmd, talvez seja necessário passar o código cmd na entrada padrão ou em um arquivo em lotes, em vez de usar /c , porque /c analisa as cotações de uma maneira diferente (o que não faz sentido mim). Isso seria

cmd <<<'"C:\Program Files\sqldeveloper\sqldeveloper\bin\sdcli.exe" format input=sentencia.tmp output=sent_formateada.tmp'
    
por 28.05.2017 / 01:34
0

Como a outra resposta indica que você deve ser capaz de executar o comando diretamente do prompt do Cygwin bash. Mas se você estiver passando argumentos de arquivo / 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 ferramenta cygpath :

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

Outra armadilha potencial a ter em conta é 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 este pode ser o caso, passe a (s) definição (ões) do Windows antes do comando. Isso lançará o programa com um ambiente contendo o valor substituído. Por exemplo, TEMP é /tmp no Cygwin, mas bem diferente no Windows, então se isso estiver causando problemas, você pode acabar com algo como:

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

Por fim, não se esqueça de citar quaisquer argumentos que contenham espaços incorporados neles.

Como uma nota lateral, eu tenho alguns scripts de wrapper que são alias para certos programas do Windows que me permitem inserir args estilo Cygwin. Os wrappers e, em seguida, usam algo como essa função para converter os argumentos no formato pronto do Windows antes de transmiti-los ao 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
}
    
por 24.06.2017 / 14:53