我正在编写一个批处理脚本,通过回显每一行并将输出定向到创建的文件来创建 VB 脚本。除了两行获取命令行变量并将其用作 VBS 变量外,它在大多数情况下都可以正常工作。这是代码:
ECHO:strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
ECHO:strProgramData = oShell.ExpandEnvironmentStrings^(^"^%ProgramData^%^"^) >> uninstallBeta.vbs
在 VB 脚本中它看起来应该像这样:
strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramData = oShell.ExpandEnvironmentStrings("%ProgramData%")
但是批处理脚本只会回显整行,包括>> uninstallBeta.vbs
。知道为什么会发生这种情况吗?我有类似的行用于创建其他 VBS 和批处理脚本,我认为这样做很好。我检查了拼写错误,没有发现任何错误。它在命令提示符中运行良好,但在批处理脚本中则不行。
答案1
它有助于理解 cmd.exe 如何解析批处理脚本:
第 1 部分 - 概述
第 2 部分 - 百分比扩展详细信息
我将处理第一条故障线路:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
第 1 阶段的百分比处理发生^
在第 2 阶段的转义处理之前。因此,解析器查找名为 的环境变量USERPROFILE^
,但找不到它。因此,它扩展为一个空字符串,剩下:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs
接下来,在第二阶段中,将插入符号处理为转义字符。重要的是,第一个^"
是转义引号,因此后面的字符是不是引号。下一个^^
是转义的插入符号。然后是第一个未转义的引号,因此后面的所有字符都用引号引起来。我在每个引号字符上方用 Q 表示:
QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs
>>
重定向不起作用的原因应该是显而易见的——它被引用,因此它充当字符串文字。
您尝试转义%
as^%
以防止批处理中的变量扩展。这不起作用。正确的做法是将百分比加倍:
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs
如果该行位于括号块内,则需要转义)
,但(
永远不需要转义
for .... do (
...
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
...
)
%
请注意,规则与命令行不同。命令行中没有真正转义的机制,%undefinedVar%
如果变量未定义,命令行会保留文本。但是,您可以通过^
在百分比之间包含一个或多个来有效地防止变量扩展,这样就不会找到变量。插入符号随后在第 2 阶段消失。但第一个引号需要转义,以便内部^
消失。并且最后一个引号必须转义,以便重定向处于活动状态。
这在命令行中有效(但在批处理脚本中无效):
echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs
插入符号可以出现在百分号之间的任意位置。以下所有符号同样有效:
%USER^PROFILE%
%^USERPROFILE%
etc.
答案2
我尝试过这个并且它也按预期工作.....
set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)
我也是批处理脚本的初学者,通过尝试我发现这是可行的。希望有人解释一下它是如何工作的。