gpt4 book ai didi

c++ - ShellExecute:Verb "runas"不适用于路径中包含空格的批处理文件

转载 作者:可可西里 更新时间:2023-11-01 10:35:11 24 4
gpt4 key购买 nike

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

最佳答案

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

至于硬编码cmd.exe 这就是CreateProcess official doc说(在描述 lpApplicationName 参数的部分的末尾):

To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file.

所以我觉得你很好。当然,包含在 " 中的路径仍然适用。

关于c++ - ShellExecute:Verb "runas"不适用于路径中包含空格的批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31247518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com