ShellExecute:动词“runas”不适用于path中有空格的batch file

我正在使用ShellExecuteW来启动一个batch file。 代码看起来有点像这样:

ShellExecuteW(GetDesktopWindow(), wide_verb.c_str(), wide_filename.c_str(), wide_parameters.c_str(), NULL, SW_SHOW); 

wide_variables的types是wstring 。 此代码适用于文件path和动词的任意组合,除了动词“runas”(获取pipe理员权限)以及在给定pathwide_filename包含空格的batch file。 popupUAC提示符,确认后一会儿,命令提示符就会闪烁,表示找不到path,在path的第一个空格处切断。

我已经尝试用额外的引号包装文件名,但是没有帮助。

原因可能是.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)。 对于batch file来说并不重要,但对于其他带参数的脚本types的文档来说,它可能会变得相关。

所以问题是:是否有可能通过ShellExecute或类似的机制执行一个batch file(其path中有空格),而没有明确地将它传递给cmd.exe?

Solutions Collecting From Web of "ShellExecute:动词“runas”不适用于path中有空格的batch file"

CreateProcessWithLogonW是你在这里需要的。 它有很多参数,但是在页面的末尾你会看到一个指示如何初始化参数的Examples部分。

至于硬编码cmd.exe这里是CreateProcess官方文档说的(在描述lpApplicationName参数的部分lpApplicationName ):

要运行批处理文件,您必须启动命令解释器; 将lpApplicationName设置为cmd.exe,并将lpCommandLine设置为以下参数:/ c加上批处理文件的名称。

所以我觉得你很好。 当然封闭的路径仍然适用。