我想在 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?這是您似乎不需要的額外複雜程度。您可以直接從 bash 呼叫 Windows 程式:
'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 中的任何其他引用方式。
如果必須呼叫 cmd,則可能需要在標準輸入或批次檔中傳遞 cmd 程式碼,而不是使用/c
,因為/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'
另一個需要注意的潛在陷阱是 Windows 和 Cygwin 之間對於某些常見環境變數(例如 HOME 或 TEMP)可能有不同的值。這不是一個常見問題,但如果您懷疑可能是這種情況,請在命令之前傳遞 Windows 定義。這將在包含覆蓋值的環境中啟動程式。例如,TEMP/tmp
在 Cygwin 中,但在 Windows 中卻截然不同,因此如果這導致了問題,您最終可能會得到以下結果:
TEMP="$LOCALAPPDATA\\Temp" MyApp.exe foo bar ...
最後,請務必引用任何嵌入空格的參數。
附帶說明一下,我有一些包裝腳本,它們是某些 Windows 程式的別名,允許我輸入 Cygwin 樣式參數。包裝器然後使用類似此函數的內容將參數轉換為 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
}