我在 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-发布=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 批处理场上运行。仅当进程作为批处理作业运行时才会失败。当我在其中一台批处理机器上从命令行运行该程序时,它运行良好,并且完全按照它应该做的那样工作。所以可能是环境问题。