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 で引用する他の方法。
/c
cmd を呼び出す必要がある場合は、 は引用符を別の方法で解析するため(私には意味がわかりません) 、 ではなく標準入力またはバッチファイルで 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 は/tmp
Cygwin ではありますが、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
}