首页 > 解决方案 > 如何在不执行的情况下回显批处理命令?

问题描述

我正在尝试制作一个自我构建的聊天机器人,通过输入问题和三个可能的答案来学习问题,然后随机化这三个答案并将其作为输出。学习的问题转到同一批处理文件的最后一行。

这是示例:

@echo off&&setlocal enabledelayedexpansion
echo/teach me a question to answer.
set/p q=
echo(>>%~f0
echo/:%q: =%>>%~f0
cls
echo/teach me three ways to answer it.
set/p a1=
set/p a2=
set/p a3=
echo/set a[0]=%a1%>>%~f0
echo/set a[1]=%a2%>>%~f0
echo/set a[2]=%a3%>>%~f0
echo/"set/a ax=%random% %%3&&set aa=!a[%ax%]!">>%~f0
echo/"echo %aa%">>%~f0

但我得到以下信息:

:howareyou?
a[0]=good
a[1]=fine
a[2]=well
"set/a ax=24793 %3&&set aa="
"echo "

有可能得到

set/a ax=%random% %%3&&set aa=!a[%ax%]!
echo %aa%

完全一样?

标签: batch-file

解决方案


这段代码有两个问题。

首先,回答你的问题:

如何准确地回显我输入的内容?

在批处理中,答案总是比你想象的要复杂。在 的情况下echo,引号并没有真正改变方式%!解释,但它们也会被回显,这现在很糟糕。

相反,%通过复制、&放置 a^和在其前!放置两个 ^s [ref]来逃避:

echo set/a ax=%%random%% %%%% 3^&^&set aa=^^!a[%%ax%%]^^! >>%~f0
echo echo %%aa%% >>%~f0

现在您可以看到,所有内容都已正确回显,但回显的代码仍然无法正常工作。

为什么?

第二个问题是&&: percent-variables ( %var%) 将在计算行或命令组(括号括起来的命令)之前被替换。

也就是说,由于set /aandset位于同一行,%ax%' 的值将在设置它之前被替换。 set /a这可以通过使用延迟扩展的强大功能及其!ax!语法来避免,但在这种情况下,这是不可能的,因为它是在另一个变量访问中访问的。

所以,改为做&&其他情况下会做的事情:

set/a ax=%random% %% 3
if %errorlevel% GTR 0 set aa=^^!a[%%ax%%]^^!

最后,你会得到类似的东西:

echo set/a ax=%%random%% %%%% 3 >>%~f0
echo if %%errorlevel%% GTR 0 set aa=^^!a[%%ax%%]^^! >>%~f0
echo echo %%aa%% >>%~f0

推荐阅读