使用 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?這是您似乎不需要的額外複雜程度。您可以直接從 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
}

相關內容