set params = %*:"="" 的最后一部分是做什么的?

Dav*_*ini 3 batch-file

我正在使用一个需要管理员权限的批处理脚本,我从 'net. 我试图弄清楚特定行的最后一部分是做什么的:

set params = %*:"=""
Run Code Online (Sandbox Code Playgroud)

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

set params = %*
Run Code Online (Sandbox Code Playgroud)

但是,这到底是做什么?

:"=""
Run Code Online (Sandbox Code Playgroud)

dbe*_*ham 5

假设您已正确复制代码 - 它根本没有什么特别之处。该:"=""文本被简单地附加到展开的参数字符串。

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

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

我敢打赌,这是一个对批处理语言几乎没有经验的人引入的错误。

几乎可以肯定还有另一个错误 - 作业中的所有空格都很重要。所以它正在创建一个名为的变量"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)

保留原始参数,并且所有引号都已正确加倍。

我已经编辑了原始答案以包含错误修复。