更新,更完整的答案

更新,更完整的答案

我正在使用需要管理员权限的批处理脚本,我从网上借用了一些获取管理员权限的代码。我试图弄清楚某一行的最后一部分的作用:

set params = %*:"=""

我知道第一部分创建一个变量,然后检索传递给脚本的整组参数;

set params = %*

但究竟正在做?

:"=""

答案1

假设您正确地复制了代码 - 它根本没有做任何特别的事情。:"=""文字只是附加到扩展的参数字符串中。

如果有%*:"=""%(请注意额外的百分比),那么它将扩展一个名为的环境变量*,用两个引号替换每个引号。

查找/替换扩展功能仅适用于变量扩展,不适用于参数扩展。

我敢打赌,这是一个由对批处理语言经验很少的人引入的错误。

几乎可以肯定还有另一个错误 - 赋值中的所有空格都很重要。因此它创建了一个名为"params "(不带引号,注意尾随空格)的变量。此外,该值将有一个前导空格。我很确定这两个空格都是不想要的。

更新,更完整的答案

现在我们知道了代码来源,可以更全面地了解正在发生的事情。需要更多的代码上下文。

原来的相关内容如下:

set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

原始批处理脚本要求以提升的管理员权限运行。该脚本能够确定管理员权限是否可用,如果没有,则创建一个临时 VBS 脚本,该脚本在运行时将创建一个具有管理员权限的新 cmd.exe 会话,并使用相同的原始参数重新运行原始批处理脚本。重新运行脚本的命令嵌入在 VBS 字符串中,该字符串可能包含带引号的参数。VBS 要求将字符串中的引号文字加倍以进行转义。

原始答案没有保留参数,也没有任何params变量。一年后,原作者试图扩展答案以支持保留调用参数。不幸的是,修改后的代码从未经过适当的测试,而且“增强”存在严重错误。如果你看看这个答案的许多评论,你会看到许多报告说参数保存仍然不起作用。

首先,代码定义了一个名为“params”的变量(带有尾随空格),然后尝试使用一个名为“params”的未定义变量(不带尾随空格)。这显然行不通。但简单地从定义中删除空格并不能解决任何问题。

set params=%*:"=""

原作者肯定以为语法会扩展为原始参数字符串,所有引号都会加倍。但 find/replace 仅在扩展变量时有效,而不是参数。

假设原始批处理脚本是c:\test\test.bat,并且使用以下命令调用它

test arg1 "arg 2" "arg 3"

“更正”后的行set params=%*:"=""只是使用 复制了参数%*,然后附加了:"=""字符串。因此,完成后,变量定义如下:

params=arg1 "arg 2" "arg 3":"=""

但楼主其实想要的是:

params=arg1 ""arg 2"" ""arg 3""

下一行用于以管理员权限重新执行脚本将会失败。它将扩展为:

echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 "arg 2" "arg 3":"=""", "", "runas", 1 >> "someTempPath\getadmin.vbs"

代码应该这样写:
编辑2018-9-23: 为参数赋值添加了空间,以确保它始终被定义,即使没有参数

set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"

第一行简单地将 params 定义为

params= arg1 "arg 2" "arg 3"

下一行使用:"=""语法在扩展变量的同时将所有引号加倍params

echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat""  arg1 ""arg 2"" ""arg 3""", "", "runas", 1 >> "someTempPath\getadmin.vbs"

原始论点被保留,并且所有引文都已适当加倍。

我有编辑了原始答案以合并错误修复。

相关内容