Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么QProcess要转换'=';在我对空间的论证中_Windows_Qt_Scons_Qprocess - Fatal编程技术网

Windows 为什么QProcess要转换'=';在我对空间的论证中

Windows 为什么QProcess要转换'=';在我对空间的论证中,windows,qt,scons,qprocess,Windows,Qt,Scons,Qprocess,我在Windows上运行Qt程序时遇到了一个奇怪的错误。该程序使用QProcess生成一个带有两个参数的子进程。传递给QProcess::start()方法的程序和参数的形式如下: "batchfile.bat" "--option1=some_value" "--option2=some_other_value\with_a\path" 出于某种原因,当这些选项进入批处理文件进行处理时,等号已转换为空格,现在看起来如下所示: "batchfile.bat" "--option1 some_v

我在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 noob),但我必须努力让它工作起来。它是运行在两个版本的RHEL(4和5)、OSX和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";
QProcess-sconsProcess;
setWorkingDirectory(build.getBuildLocation());
setProcessChannelMode(QProcess::MergedChannels);

qDebug()您是否尝试过转义
=
符号?此外,示例中的路径肯定需要转义
\
字符。

很可能是因为引号没有通过(可能需要转义,请参阅)

cmd.exe将命令行选项中的等号视为参数之间的分隔符,类似于空格或制表符。这只是Windows cmd脚本中许多奇怪之处之一:

C:\test>type c:\util\cmdechoargs.cmd
@echo off
setlocal
set /a i=0
echo args[*]: %*
:loop
if {%1} == {} goto :eof
echo argv[%i%]: %1
set /a i=%i% + 1
shift
goto :loop


C:\test>cmdechoargs testing=123
args[*]: testing=123
argv[0]: testing
argv[1]: 123

C:\test>cmdechoargs "testing=123"
args[*]: "testing=123"
argv[0]: "testing=123"
关于如何在Windows cmd脚本中处理命令行参数,我遇到的最好的文档是-只花一分钱就可以使用一个

根据更新中给出的示例,我认为您可能希望在包含等号的选项中嵌入引号:

"\"--variant=%1-%2\""
"\"--source-release=%1\""

编辑--新材质 下面的脚本有一个例程,该例程将删除传递给cmd脚本的参数的引号。该例程使用Tim Hill在上面提到的一本书中的习惯用法/技术,在名为
RET
的环境变量中返回'dequoted'参数。我从这里的一个示例中窃取了一些删除引号的代码,但使它更健壮地处理空引号

@echo off
setlocal
set /a i=0
echo args[*]: %*
:loop
if {%1} == {} goto :eof
echo.
echo argv[%i%]: %1

call :dequote %1
set dequoted_arg=%RET%
echo argv[%i%] ^(dequoted^): %dequoted_arg%

set /a i=%i% + 1
shift
goto :loop


:dequote
setlocal
SET _string=###%1###
if {%_string%} == {######} goto :dequote_empty
if {%_string%} == {###""###} goto :dequote_empty
SET _string=%_string:"###=%
SET _string=%_string:###"=%
SET _string=%_string:###=%
goto :dequote_done

:dequote_empty
set _string=

:dequote_done
endlocal & (set RET=%_string%) & goto :eof

这就是为什么(在我看来)除了最简单的任务之外,您要避免使用cmd脚本的原因。但是,我希望这能帮助您通过批处理文件将不带引号的参数传递给scons进程。

请显示调用
QProcess::start()
-这样我们就不必猜测您可能使用的重载以及引号和其他特殊字符本身是否带引号、转义或其他任何内容。@Michael。实际上,我已经用两个重载(一个字符串用于命令和参数,一个字符串用于程序,一个字符串用于参数)进行了尝试,结果是一样的。我将发布一个示例。我应该尝试一下,但是代码是在RHEL4、RHEL5、OSX10.4和Windows上编译的。转义“=”是否会导致unix版本出现问题?(包含路径的条目的值是从MySQL中存储的配置中提取出来的,看起来没有额外的转义),好吧,所以你没有像你最初的问题中所说的那样逐字传递字符串。然后,请细化您的问题,看起来您希望传递一个带有未转义反斜杠的字符串(对于编译器来说,作为文本字符串是错误的)。转义等号的效果完全为零:(在参数周围添加一组额外的转义引号并没有起作用,它成功地将其转换为一个参数,=符号没有消失,但引号随后被传递给了SCons,它认为整个过程是一个构建目标,而不是一个选项和值。@dagorym:我添加了一个可以去掉引号的示例在你的cmd脚本中使用ch文件参数。我希望它有帮助…我能够使用它来解决问题。谢谢。在刚刚开始工作的过程中,我发现了执行环境中的另一个问题,我现在必须运行它。:)