如何在CMake中通过execute_process调用路径含空格的.bat文件
问题原因与解决方案
你遇到的报错是两个解析规则叠加导致的:
cmd /c的特殊解析逻辑:如果/c后跟随的参数被引号包裹,cmd会自动删除首尾的一对引号,再将剩余内容按空格拆分执行。你手动给路径加引号后,要么引号被CMake转义变成路径的一部分,要么引号被cmd删除后带空格的路径被拆成多个部分,导致只识别到E:/dev/test就截断。- CMake的
execute_process参数拆分规则:COMMAND后以空格分隔的每个值会被作为独立参数传递给调用的程序,你额外添加的转义引号会被CMake识别为参数内容的一部分,最终传递给cmd的时候路径带有多余的引号,导致识别失败。
可用解决方案
方案1:直接指定bat文件作为执行命令(推荐)
CMake会自动识别.bat后缀,调用cmd执行,不需要手动写cmd /c,直接用引号包裹带空格的路径即可:
execute_process( COMMAND "E:/dev/test folder with spaces/test with spaces.bat" # 可选:指定bat执行时的工作目录为bat所在文件夹 WORKING_DIRECTORY "E:/dev/test folder with spaces" )
方案2:必须显式调用cmd /c时的写法
如果需要手动控制cmd的调用逻辑,使用CMake的方括号字符串避免转义问题,同时加上VERBATIM参数保证参数传递符合Windows平台规则:
execute_process( COMMAND cmd /c [=["E:/dev/test folder with spaces/test with spaces.bat"]=] VERBATIM )
内容的提问来源于stack exchange,提问作者Mathieu Poulin
相关产品推荐
相关产品推荐

