batch-file - 如何在不执行的情况下回显批处理命令?
问题描述
我正在尝试制作一个自我构建的聊天机器人,通过输入问题和三个可能的答案来学习问题,然后随机化这三个答案并将其作为输出。学习的问题转到同一批处理文件的最后一行。
这是示例:
@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%
完全一样?
解决方案
这段代码有两个问题。
首先,回答你的问题:
如何准确地回显我输入的内容?
在批处理中,答案总是比你想象的要复杂。在 的情况下echo
,引号并没有真正改变方式%
和!
解释,但它们也会被回显,这现在很糟糕。
相反,%
通过复制、&
放置 a^
和在其前!
放置两个 ^
s [ref]来逃避:
echo set/a ax=%%random%% %%%% 3^&^&set aa=^^!a[%%ax%%]^^! >>%~f0
echo echo %%aa%% >>%~f0
现在您可以看到,所有内容都已正确回显,但回显的代码仍然无法正常工作。
为什么?
第二个问题是&&
: percent-variables ( %var%
) 将在计算行或命令组(括号括起来的命令)之前被替换。
也就是说,由于set /a
andset
位于同一行,%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
推荐阅读
- sql - 计算时间戳列的相等日期部分跨所述列的组
- java - 如何让这段代码“更实用”?
- json - 在 Python 3.4.4 中从 json 文件中获取数据
- amazon-web-services - 在 AWS 中为 EBS 自动选择最新的 java SE 配置
- javascript - ThymeLeaf:th:if 中的不等于表达式
- javascript - 错误:page.setRequestInterception 不是函数
- magento - Magento 1.9 文件上传在购物车页面上显示序列化值
- javascript - 从 mongodb 中的对象返回特定数组
- html - 如何在Angular 5中为国家和城市进行下拉列表集成?
- arm - ARM寄存器约定在哪里?