【发布时间】:2010-06-11 20:50:19
【问题描述】:
我在 Windows 上运行 Qt 程序时遇到了一个奇怪的错误。该程序使用 QProcess 生成具有两个参数的子进程。传递给 QProcess::start() 方法的程序和参数的格式为:
"batchfile.bat" "--option1=some_value" "--option2=some_other_value\with_a\path"
由于某些原因,当这些选项进入批处理文件以处理等号时,已经转换为空格,现在看起来像:
"batchfile.bat" "--option1 some_value" "--option2 some_other_value\with_a\path"
因此,处理失败。任何想法可能导致等号被空格替换?我正在使用 Qt 下载页面上的 QT 4.6.3 框架的 mingw 构建。
编辑: 这是实际的代码。我没有写它(我是一个完整的 Qt 菜鸟),但我必须尝试让它工作。它是在两个版本的 RHEL(4 和 5)、OS X 和 Windows 上运行的自动化构建系统的一部分。除了 Windows,它在任何地方都可以正常工作。
QProcess sconsProcess;
sconsProcess.setWorkingDirectory(build.getBuildLocation());
sconsProcess.setProcessChannelMode(QProcess::MergedChannels);
qDebug()<<"Starting scons process:"<<build.getSconsLocation()<<QString("--variant=%1-%2").arg(build.getOs()).arg(build.getVariant())<<
QString("--source-release=%1").arg(build.getSettings().getSetting("sourceReleaseLocation", QStringList()<<"BUILDLOCATION"<<"VERSION",
QStringList()<<build.getBuildLocation()<<build.getBuildPackage().getVersion()).toString());
sconsProcess.start(build.getSconsLocation(), QStringList()<<QString("--variant=%1-%2").arg(build.getOs()).arg(build.getVariant())<<
QString("--source-release=%1").arg(build.getSettings().getSetting("sourceReleaseLocation", QStringList()"BUILDLOCATION"<<"VERSION",
QStringList()<<build.getBuildLocation()<<build.getBuildPackage().getVersion()).toString()));
qDebug()<<"Source release build process started";
在 Windows 中转换为的实际值(在第一个 qDebug() 打印调用中打印出来的位)是:
调试:启动 scons 进程:“V:\Glast_Software\Toaster\tools\Python2.5\Scripts\scons-1.3.0.bat”“--variant=Windows-i386-32bit-vc71-Debug”“- -source-release=V:\Glast_Software\Toaster\ReleaseManagerBuild\Windows-i386-32bit-vc71\Debug\ScienceTools\LATEST-1-3163\ScienceTools-LATEST-1-3163-source.zip"
但是在 scons-1.3.0.bat(我让它回显了所有执行的命令)内部,传递的参数看起来像:
"--variant Windows-i386-32bit-vc71-Debug" ""--source-release V:\Glast_Software\Toaster\ReleaseManagerBuild\Windows-i386-32bit-vc71\Debug\ScienceTools\LATEST-1-3163\ ScienceTools-LATEST-1-3163-source.zip"
缺少等号。
编辑(2010 年 6 月 29 日): 我应该补充一点,该系统设计为使用 LSF 批处理排队系统在小型 Windows 批处理场上运行。仅当进程作为批处理作业运行时才会失败。当我在其中一台批处理机器上从命令行运行该程序时,它运行良好,并且完全按照它应该做的那样工作。所以可能是环境问题。
【问题讨论】:
-
请显示调用
QProcess::start()的实际代码 - 这样我们就不必猜测您可能使用的重载以及引号和其他特殊字符本身是否被引用、转义或其他。 -
@迈克尔。实际上,我已经尝试过两种重载(命令和参数的一个字符串以及程序的字符串和参数的字符串列表),结果是一样的。我会发布一个示例。