我正在使用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?
答案 0 :(得分:1)
CreateProcessWithLogonW就是你需要的。它有很多参数,但在页面的末尾你会看到一个 Examples 部分,指示如何初始化args。
至于硬编码cmd.exe
这里CreateProcess official doc说的是什么(在描述lpApplicationName
参数的部分的末尾):
要运行批处理文件,必须启动命令解释程序;将lpApplicationName设置为cmd.exe并将lpCommandLine设置为以下参数:/ c加上批处理文件的名称。
所以我觉得你很好。当然,"
中包含的路径仍然适用。