批处理 - 使用变量替换值

时间:2017-08-15 20:47:40

标签: batch-file

我正在尝试创建一个.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或其他脚本工具的其他人。

任何人的想法?

感谢。

2 个答案:

答案 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?