Cygwin からのパラメータを使用して Windows プログラムを実行する

Cygwin からのパラメータを使用して Windows プログラムを実行する

Cygwin コンソールで Windows プログラムを実行したいのですが、さまざまな形式を試しましたが、正しい構文が見つかりません。

 $ 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 で引用する他の方法。

/ccmd を呼び出す必要がある場合は、 は引用符を別の方法で解析するため(私には意味がわかりません) 、 ではなく標準入力またはバッチファイルで cmd コードを渡す必要があるかもしれ/cません。

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

答え2

他の回答が示すように、Cygwin bash プロンプトから直接コマンドを実行できるはずです。ただし、ファイル/ディレクトリ引数を渡す場合、ネイティブ Windows プログラムはネイティブ Windows パスを期待します。このようなパスを手動で構築するのではなく、次のcygpathツールを使用できます。

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

もう一つの注意すべき落とし穴は、HOME や TEMP などの特定の共通環境変数の値が Windows と Cygwin で異なる可能性があることです。これはそれほど一般的な問題ではありませんが、その可能性があると思われる場合は、コマンドの前に Windows 定義を渡します。これにより、オーバーライドされた値を含む環境でプログラムが起動します。たとえば、TEMP は/tmpCygwin ではありますが、Windows ではまったく異なります。そのため、これが問題の原因である場合は、次のような結果になる可能性があります。

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

最後に、スペースが埋め込まれている引数は必ず引用符で囲んでください。

補足ですが、Cygwin スタイルの引数を入力できる特定の Windows プログラムにエイリアスされたラッパー スクリプトがいくつかあります。ラッパーは、引数をネイティブ アプリに渡す前に、次のような関数を使用して引数を 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
}

関連情報