我正在使用需要管理员权限的批处理脚本,我从网上借用了一些获取管理员权限的代码。我试图弄清楚某一行的最后一部分的作用:
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"
原始论点被保留,并且所有引文都已适当加倍。
我有编辑了原始答案以合并错误修复。