将 ECHO 输出写入 VBS 文件不起作用

将 ECHO 输出写入 VBS 文件不起作用

我正在编写一个批处理脚本,通过回显每一行并将输出定向到创建的文件来创建 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%%%%"^)

我也是批处理脚本的初学者,通过尝试我发现这是可行的。希望有人解释一下它是如何工作的。

相关内容