如何在Batch句子生成器中实现输入句内直接调用文本文件变量
批处理句子生成器模板变量替换实现方案
你的需求完全可以实现,不属于Batch批处理的固有功能限制,只需要新增模板变量提取、替换逻辑即可,修改后的实现如下:
核心修改思路
- 输入环节仅需录入带
$前缀变量标记的完整模板语句,无需拆分前中后段内容 - 自动提取模板内所有
$开头的变量名,匹配对应词库txt文件,读取打乱后的首个条目存入临时变量 - 批量替换模板中的变量标记为对应词库内容,直接输出完整生成句子
完整修改后代码
@echo off setlocal enabledelayedexpansion :: 仅需输入一次带变量的模板 set /p "template=请输入生成模板(变量以$开头,示例:this $celebrity is really great):" set "rcs_path=C:\Users\%USERNAME%\Desktop\gg\rcs" :gen cls echo 正在处理词库,请稍候 :) :: 提取模板中所有$变量 set "temp_template=!template!" :extract_var if "!temp_template:$=!"=="!temp_template!" goto extract_done for /f "tokens=1* delims=$" %%a in ("!temp_template!") do ( set "var_part=%%b" :: 提取变量名(到非字母数字字符截止) set "var_name=" :parse_var_name for /f "tokens=1* delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" %%c in ("!var_part!") do ( set "split_char=%%c" if not "!split_char!"=="" ( for /f "delims=!split_char!" %%d in ("!var_part!") do set "var_name=%%d" ) else ( set "var_name=!var_part!" ) ) :: 处理对应词库 if exist "!rcs_path!\!var_name!.txt" ( :: 打乱词库 cd /d "!rcs_path!" del /q "new!var_name!.txt" 2>nul for /f "delims=" %%e in (!var_name!.txt) do call set "$$%%random%%=%%e" (for /f "tokens=1,* delims==" %%e in ('set $$') do echo(%%f)>new!var_name!.txt set "$$=" :: 读取第一个条目存为变量 set /p "!var_name!="<"new!var_name!.txt" ) :: 截断模板继续找下一个变量 set "temp_template=!var_part:*%split_char%=!" ) goto extract_var :extract_done :: 替换模板中的所有$变量 set "result=!template!" for /f "tokens=1 delims==" %%v in ('set') do ( set "result=!result:$%%v=!%%v!" ) :: 输出结果 cls echo. echo 生成结果:!result! echo. echo 输入back返回修改模板,输入gen重新生成新内容 set /p "instruction=请输入操作指令:" if /i "!instruction!"=="back" ( endlocal goto :eof ) if /i "!instruction!"=="gen" ( goto gen ) goto instruction
注意事项
- 变量名仅支持英文、数字组合,不要包含空格、特殊符号
- 词库文件需和
$后的变量名完全对应,例如$celebrity对应词库文件必须为celebrity.txt - 保留了原脚本的词库打乱逻辑,每次执行gen指令都会重新打乱词库生成新的内容
内容的提问来源于stack exchange,提问作者miki
相关产品推荐
相关产品推荐

