我正在尝试创建一个.bat程序来替换一个文本文件中的两个字符串,并多次输出修改后的文本。
到目前为止一直很好......
我的计划的目的是计算两个日期之间的月数(例如:01/2016和05/2017将导致17个月),并为第三方程序生成每月一个配置文件(17在我的例子中输出文件)。这可以通过将模板配置文件中的两个标签(和)替换为该范围内的相应月/年值来实现。
到目前为止我的代码如下:
@echo off &setlocal
setlocal ENABLEDELAYEDEXPANSION
cls
set "CNST_SEARCH_YEAR=<VAR_YEAR>"
set "CNST_SEARCH_MONTH=<VAR_MONTH>"
set "CNST_FILE_TEMPLATE=config_template.properties"
set "CNST_FILE_TMP=tmp_config.properties"
rem ===============================
rem INPUT DO USUÁRIO
rem ===============================
set "start_year=2014"
set "start_month=3"
set "end_year=2015"
set "end_month=7"
rem ===============================
rem DEFINIÇÂO DO TOTAL DE ITERAÇÕES
rem ===============================
set /a "iterations=(%end_year%*12 + %end_month%) - (%start_year%*12 + %start_month%) + 1"
echo DISPARO AUTOMATICO DA ROTINA AGENT - v1.0
echo ================================
echo Total de iteracoes: %iterations%
echo ================================
rem ===============================
rem EXECUÇÃO DO LOOP PRINCIPAL
rem ===============================
set v_year=%start_year%
set v_month=%start_month%
for /L %%i IN (1, 1, %iterations%) do (
echo ================================
echo Iteracao: %%i
echo !v_year! / !v_month!
echo Gerando parametrizacoes...
for /f "delims=" %%j in (%CNST_FILE_TEMPLATE%) do (
set "line=%%j"
set "line=!line:%CNST_SEARCH_YEAR%=!v_year!"
set "line=!line:%CNST_SEARCH_MONTH%=!v_month!"
echo !line! >> "%CNST_FILE_TMP%_%%i"
)
echo Executando Agent...
rem jre\bin\java.exe -jar gdc-agent-totvs-2.0.0.jar %CNST_FILE_TMP%
echo Apagando arquivo temporario...
rem del %CNST_FILE_TMP%
IF !v_month! EQU 12 (
set v_month=1
set /a v_year=!v_year!+1
) ELSE (
set /a v_month=!v_month!+1
)
echo ================================
)
endlocal
pause
我的问题依赖于以下几行:
set "line=!line:%CNST_SEARCH_YEAR%=v_year!"
set "line=!line:%CNST_SEARCH_MONTH%=v_month!"
因为我无法在该命令中多次使用delayedExpansion。此外,我无法在for循环之前定义v_year和v_month变量,因为它们的值是由循环设置的。
我正在使用普通批处理脚本,因为此程序将被发送给可能没有PowerShell或其他脚本工具的其他人。
任何人的想法?
感谢。
答案 0 :(得分:0)
您可以尝试使用类似
的内容for %%v in (!v_year!) do set "line=!line:%CNST_SEARCH_YEAR%=%%v!"
这只是将延迟的扩展值移动到for
可替换参数,该参数可用于set
命令中使用的延迟扩展表达式
答案 1 :(得分:0)
或者结合旧式调用变体
call set "line=%%line:!CNST_SEARCH_YEAR!=!v_year!%%"
call set "line=%%line:!CNST_SEARCH_MONTH!=!v_month!%%"
要将百分号转义为被解释为包含变量,您必须将其加倍。解析器在此步骤中将两个%%
减少为单个。
执行!var!
的正常延迟扩展。
调用会强制对解析器进行第二次评估,这次评估会查找单个百分号,并对当前值进行操作。
要了解有关此主题的更多信息,请阅读How does the Windows Command Interpreter (CMD.EXE) parse scripts?