使用 CreateProcess 运行带空格的 bat

Posted

技术标签:

【中文标题】使用 CreateProcess 运行带空格的 bat【英文标题】:Use CreateProcess to run bat with spaces 【发布时间】:2015-08-10 17:21:13 【问题描述】:

CreateProcess documentation 声明为了运行批处理文件,必须使用cmd.exe /C <path to bat>。事实上,它可以很好地运行批处理文件,除非脚本的路径包含空格(微软在MS14-019 vulnerability 的描述中确认了这一点)。我想知道是否可以转义批处理文件路径中的空格以使 CreateProcess 工作。添加引号没有帮助,CreateProcess 失败并出现错误:

cannot spawn "<path to batch>": No such file or directory

更新

一种解决方法是使用 cmets 中 @jac 指出的短文件名。我仍然想知道为什么用双引号将路径括起来适用于普通可执行文件但不适用于批处理文件。

【问题讨论】:

改用ShellExecuteEx。 不幸的是我没有调用 CreateProcess 的代码,所以切换到 ShellExecuteEx 或cmd.exe /C 不是一个选项。 根据你的问题,你已经知道答案了。 你试过转换成DOS路径吗? IE。 C:\PROGRA~1 而不是 C:\PROGRAM FILES。 不走运,我认为逻辑必须在 Win32 层中。 【参考方案1】:

CreateProcess 没有转义字符。

由于代码已损坏且您无法修复,因此您必须解决问题。例如,创建到目标目录的连接点并通过连接点路径启动批处理文件,或者使用 jac 建议的短路径。 (请注意,并非所有卷都必须启用短路径,但如果您正在处理系统卷,则可以安全地假设它们会启用。)

【讨论】:

以上是关于使用 CreateProcess 运行带空格的 bat的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess : 应用程序路径中的转义空格

CreateProcess 不会使用参数启动进程

使用 CreateProcess 运行批处理文件

取决于进程创建的执行异常(ShellExecute vs CreateProcess)

使用 CreateProcess 运行游戏可执行文件

CreateProcess 无法运行 sfc.exe ?为啥