使用 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
}

相关内容