【发布时间】:2015-07-06 13:46:11
【问题描述】:
我正在使用 ShellExecuteW 来启动一个批处理文件。代码看起来有点像这样:
ShellExecuteW(GetDesktopWindow(), wide_verb.c_str(), wide_filename.c_str(), wide_parameters.c_str(), NULL, SW_SHOW);
其中wide_ 变量的类型为wstring。此代码适用于文件路径和动词的任意组合,除了动词“runas”(获取管理员权限)和给定路径wide_filename 中带有空格的批处理文件。会弹出 UAC 提示符,确认后会短暂闪烁命令提示符,提示找不到路径,并在路径中的第一个空格处截断。
我已经尝试将文件名包含在额外的引号中,但这没有帮助。
原因可能是 .bat 文件不是真正的“可执行文件”,而是文档,因此
ShellExecuteW(GetDesktopWindow(), L"runas", L"C:\\Path To\\file.bat", L"Parameters For Batch", NULL, SW_SHOW);
在内部映射到提升的执行
cmd.exe /C "C:\Path To\file.bat" "Parameters for Batch"
虽然它应该类似于
cmd.exe /S /C " "C:\Path To\file.bat" Parameters for Batch "
确实,如果我执行这样的操作:
ShellExecuteW(GetDesktopWindow(), L"runas", L"cmd.exe", L"/S /C \" \"C:\\Path To\\file.bat\" Parameters For Batch \"", NULL, SW_SHOW);
它成功了!
但是,这似乎不是对可执行文件(在本例中为 cmd.exe)进行“硬编码”的最干净的方法。对于批处理文件,它确实无关紧要,但对于其他带有参数的脚本类型文档,它可能变得相关。
所以问题是:是否可以执行通过 ShellExecute 或类似机制提升的批处理文件(路径中有空格),而无需将其显式传递给 cmd.exe?
【问题讨论】:
标签: c++ windows batch-file shellexecute