我正在使用一个需要管理员权限的批处理脚本,我从 'net. 我试图弄清楚特定行的最后一部分是做什么的:
set params = %*:"=""
Run Code Online (Sandbox Code Playgroud)
我知道第一部分创建一个变量,然后检索传递给脚本的整个参数集;
set params = %*
Run Code Online (Sandbox Code Playgroud)
但是,这到底是该做什么?
:"=""
Run Code Online (Sandbox Code Playgroud)
假设您已正确复制代码 - 它根本没有什么特别之处。该:"=""
文本被简单地附加到展开的参数字符串。
如果你有%*:"=""%
(注意额外的百分比),那么它会扩展一个名为 的环境变量*
,为每个变量替换两个引号。
查找/替换扩展功能仅适用于变量扩展,而不适用于参数扩展。
我敢打赌,这是一个对批处理语言几乎没有经验的人引入的错误。
几乎可以肯定还有另一个错误 - 作业中的所有空格都很重要。所以它正在创建一个名为的变量"params "
(没有引号,注意尾随空格)。此外,该值将有一个前导空间。我很确定这两个空间都不需要。
既然我们知道了代码的来源,就可以更全面地了解正在发生的事情。需要更多的代码上下文。
原来的相关行是:
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
Run Code Online (Sandbox Code Playgroud)
原始批处理脚本要求它以提升的管理员权限运行。该脚本能够确定管理员权限是否可用,如果不可用,则创建一个临时 VBS 脚本,该脚本在运行时将创建一个具有管理员权限的新 cmd.exe 会话,并使用相同的原始参数重新运行原始批处理脚本. 重新运行脚本的命令嵌入在 VBS 字符串中,该字符串可能包含带引号的参数。VBS 要求字符串中的引号文字通过将它们加倍来转义。
原始答案没有保留参数,也没有任何params
变量。一年后,OP 试图扩展答案以支持保留调用参数。不幸的是,修改后的代码从未被正确测试过,并且“增强”被严重窃听。如果您查看对该答案的许多评论,您会看到许多关于参数保留仍然不起作用的报告。
首先,代码定义了一个名为“params”(带有尾随空格)的变量,然后尝试使用一个名为“params”(没有尾随空格)的未定义变量。那显然行不通。但简单地从定义中删除空格并不能解决任何问题。
set params=%*:"=""
Run Code Online (Sandbox Code Playgroud)
OP 一定认为语法会扩展到原始参数字符串,所有引号都加倍。但是 find/replace 仅在扩展变量时有效,而不是参数。
假设原始批处理脚本是c:\test\test.bat
,并且使用
test arg1 "arg 2" "arg 3"
Run Code Online (Sandbox Code Playgroud)
“已更正”行set params=%*:"=""
简单地使用 获取参数的副本%*
,然后附加:"=""
字符串。因此,完成后,变量定义如下:
params=arg1 "arg 2" "arg 3":"=""
Run Code Online (Sandbox Code Playgroud)
但 OP 实际上想要:
params=arg1 ""arg 2"" ""arg 3""
Run Code Online (Sandbox Code Playgroud)
用于以管理员权限重新执行脚本的下一行将失败。它将扩展为:
echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 "arg 2" "arg 3":"=""", "", "runas", 1 >> "someTempPath\getadmin.vbs"
Run Code Online (Sandbox Code Playgroud)
这是应该编写的代码:
EDIT 2018-9-23: 为params赋值添加了空间以确保它始终被定义,即使没有参数
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
Run Code Online (Sandbox Code Playgroud)
第一行简单地将 params 定义为
params= arg1 "arg 2" "arg 3"
Run Code Online (Sandbox Code Playgroud)
下一行使用:"=""
语法在扩展params
变量时将所有引号加倍:
echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 ""arg 2"" ""arg 3""", "", "runas", 1 >> "someTempPath\getadmin.vbs"
Run Code Online (Sandbox Code Playgroud)
保留原始参数,并且所有引号都已正确加倍。
我已经编辑了原始答案以包含错误修复。
归档时间: |
|
查看次数: |
922 次 |
最近记录: |