我正在使用 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?