【问题标题】:ShellExecute: Verb "runas" does not work for batch files with spaces in pathShellExecute:动词“runas”不适用于路径中有空格的批处理文件
【发布时间】: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


    【解决方案1】:

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

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

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

    所以我认为你很好。当然,"s 中的路径仍然适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多