我想在 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
}