使用CreateProcessW调用cmd重定向控制台程序输出遇路径错误
解决带空格路径的控制台程序输出重定向问题
问题背景
开发Shell GUI应用时,通过CreateProcessW启动控制台程序后退出,让程序独立运行。需要将控制台程序的调试输出重定向到文件,因为要GUI退出后不干预后续流程,所以选择用cmd.exe的标准重定向符号实现,但遇到路径解析错误。
尝试的命令及错误
- 最初使用的命令:
"C:\Windows\System32\cmd.exe" /c "C:\Program Files (x86)\ConsoleProgram\ConsoleProgram.exe" -debug > "R:\log.txt" 2>&1
出现错误:
"C:\Program" 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 改用Unix风格路径后:
"C:\Windows\System32\cmd.exe" /c "/C/Program Files (x86)/ConsoleProgram/ConsoleProgram.exe" -debug > "R:\log.txt" 2>&1
出现错误:
系统找不到指定的路径。
原因分析
- 第一个命令的问题在于
cmd.exe的/c参数解析逻辑:当/c后面的参数被引号包裹时,cmd会去掉外层引号,然后将剩余内容按空格分割,导致带空格的路径被截断为C:\Program。 - 第二个命令用Unix风格斜杠,Windows系统无法识别这种路径格式,因此找不到程序。
解决方法
需要给/c后面的整个命令字符串加上外层引号,同时保留程序路径的内层引号,确保cmd正确解析完整路径和重定向参数。正确的命令格式如下:
"C:\Windows\System32\cmd.exe" /c ""C:\Program Files (x86)\ConsoleProgram\ConsoleProgram.exe" -debug > "R:\log.txt" 2>&1"
或者在CreateProcessW中传递参数时,将命令行参数设置为:
/c ""C:\Program Files (x86)\ConsoleProgram\ConsoleProgram.exe" -debug > "R:\log.txt" 2>&1"
这样cmd会将外层引号内的所有内容当作一个完整命令执行,不会截断带空格的路径,同时正确处理输出重定向。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

