如何使用Delayed Variable Expansion来引用string中的variables

我正在尝试创build一个小脚本来执行轻量级模板replace任务,但是我正在用我想要的方式解除引用一个variables。

这是我的模板replacebatch file

@echo off echo ------------ echo %~nx0% SETLOCAL ENABLEDELAYEDEXPANSION SET "src=%~1" SET "dst=%~2" ECHO %src% FOR /F "tokens=1,2* delims=%%" %%i IN (%src%) DO ( IF "%%k"=="" ( ECHO %%i >> %dst% ) ELSE ( SET "first=%%i" SET "middle=%%j" SET "last=%%k" SET "replace=!middle:~2,-1!" IF NOT "!first:~-1!"=="<" ( ECHO %%i >> %dst% ) ELSE IF NOT "!middle:~0,1!"=="=" ( ECHO %%i >> %dst% ) ELSE IF NOT "!last:~0,1!"==">" ( ECHO %%i >> %dst% ) ELSE ( ECHO !first:~0,-1! ^<^< !replace! ^>^> !last:~1! ) ) ) ENDLOCAL GOTO :EOF :Error EXIT /B 1 

示例input文件可能如下所示:

 { "name": "<%= comp.name %>", "version": "<%= comp.version %>", "description": "<%= comp.description %>", "author": "me", "url": "https://localhost/<%= comp.name %>" } 

一个示例调用可能如下所示:

 SET comp.name=TestApp SET comp.version=1.0 SET comp.description=The most awesome thing you will ever see CALL TemplateReplacement.bat %1 %2 

我想看到的例子输出是:

 { "name": "TestApp", "version": "1.0", "description": "The most awesome thing you will ever see", "author": "me", "url": "https://localhost/TestApp" } 

当我进入ELSE时,我得到如下输出:

  "name": " << comp.name >> ", "version": " << comp.version >> ", "description": " << comp.description >> ", 

(注意:我正在有意识地将replace情况向控制台和文件回传,因为我在debugging;这反映在上面的输出中)。

!更换! 是正确的; 这是我想扩大的variables的名称,所以我试图!!replace!!,因为我的预期!replace! 转储一些像comp.name然后!comp.name! 将解决TestApp(因为我希望它在执行时解决,这感觉就像正确的语法嗅探)。 这不是发生了什么,但是 – 而是我只是得到comp.name,等我现在经历了每一个替代我可以认为尝试迭代(例如%!replace!%,!!replace!!和无意义的像%%replace%%,!%replace%!和!!!replace!!!),但没有什么jive。 ECHOing!comp.name! 从FOR内部显示,该variables可以解决(%comp.name%),所以我非常困惑,为什么!!取代! 这不是在这里做的正确的事情。

有没有我失踪的诡计?

PS而替代脚本,将解决我试图解决的问题当然是受欢迎的,我有兴趣知道为什么我不能解决这个问题。

Solutions Collecting From Web of "如何使用Delayed Variable Expansion来引用string中的variables"

这个答案解释了这种类型的管理。 例如,您可以使用以下任何一种方法:

 CALL SET replace=%%!middle:~2,-1!%% FOR /F %%a IN ("!middle:~2,-1!") DO SET replace=!%%a! 

最后一行比前一行更快…

这应该与您的测试文件一起工作,并可以帮助您解决您的具体问题:

 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION SET SRC=%~1 SET DST=%~2 (FOR /F "TOKENS=1,2* DELIMS=<>" %%A IN ('FINDSTR/R "%%.*%%" "%SRC%"') DO ( SET PRE=%%B CALL ECHO=%%A%%!PRE:~3,-2!%%%%C))>%DST%