Führen Sie ein Windows-Programm mit Parametern von Cygwin aus

Führen Sie ein Windows-Programm mit Parametern von Cygwin aus

Ich möchte ein Windows-Programm in der Cygwin-Konsole ausführen. Ich habe verschiedene Möglichkeiten ausprobiert, finde aber nicht die richtige Syntax.

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

Antwort1

Warum rufen Sie cmd auf? Das ist eine zusätzliche Komplexitätsebene, die Sie anscheinend nicht benötigen. Sie können das Windows-Programm direkt von Bash aus aufrufen:

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

oder

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

oder jede andere Art des Zitierens in sh.

Wenn Sie cmd aufrufen müssen, müssen Sie den cmd-Code möglicherweise auf der Standardeingabe oder in einer Batchdatei statt mit übergeben /c, da /cAnführungszeichen auf eine andere Weise analysiert werden (was für mich keinen Sinn ergibt). Das wäre

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

Antwort2

Wie aus der anderen Antwort hervorgeht, sollten Sie den Befehl direkt von der Cygwin-Bash-Eingabeaufforderung aus ausführen können. Wenn Sie jedoch Datei-/Verzeichnisargumente übergeben, erwarten native Windows-Programme einen nativen Windows-Pfad. Anstatt zu versuchen, einen solchen Pfad manuell zu erstellen, können Sie das folgende cygpathTool verwenden:

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

Ein weiterer potenzieller Fehler, den Sie beachten sollten, ist, dass Sie für bestimmte allgemeine Umgebungsvariablen wie HOME oder TEMP möglicherweise unterschiedliche Werte zwischen Windows und Cygwin haben. Dies ist kein so häufiges Problem, aber wenn Sie vermuten, dass dies der Fall sein könnte, übergeben Sie die Windows-Definition(en) vor dem Befehl. Dadurch wird das Programm mit einer Umgebung gestartet, die den überschriebenen Wert enthält. Beispielsweise ist TEMP /tmpin Cygwin, aber in Windows ganz anders. Wenn dies Probleme verursacht, könnte das Ergebnis etwa wie folgt aussehen:

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

Denken Sie abschließend daran, alle Argumente, die Leerzeichen enthalten, in Anführungszeichen zu setzen.

Als Randbemerkung: Ich habe einige Wrapper-Skripte, die mit bestimmten Windows-Programmen verknüpft sind und mir die Eingabe von Argumenten im Cygwin-Stil ermöglichen. Die Wrapper verwenden dann so etwas wie diese Funktion, um die Argumente in ein Windows-fähiges Format zu konvertieren, bevor sie an die native App übergeben werden:

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

verwandte Informationen