我正在尝试创建一个小脚本来执行轻型模板替换任务,但我无法按照我想要的方式取消引用变量。
这是我的模板替换批处理文件:
@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
示例输入文件可能如下所示:
{
"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 >> ",
(注意:我有意将替换情况回显到控制台而不是文件,因为我正在调试;这反射(reflect)在上面的输出中)。
!替换!是正确的;这是我要扩展的变量的名称,所以我尝试了 !!replace!!,因为我期望 !replace!转储类似 comp.name 的内容,然后转储 !comp.name!将解析为 TestApp(并且因为我希望它在执行时解析,所以这感觉就像是要嗅探的正确语法)。然而,事实并非如此——相反,我只是得到 comp.name 等。我现在已经完成了我可以尝试尝试的每一次替换迭代(例如 %!replace!%、!!replace!! 和无意义的像%%replace%%, !%replace%! and !!!replace!!!) 但没有任何问题。呼应 !comp.name!从 FOR 内部显示可以解析变量(%comp.name% 也是如此)所以我非常困惑为什么 !!replace!!不适合在这里做。
有没有我遗漏的技巧?
附注虽然可以解决我正在尝试解决的问题的替代脚本当然是受欢迎的,但我很想知道为什么我不能以这种方式解决它。
最佳答案
这种类型的管理在 this answer 中有解释。 ;例如,您可以使用以下任何一种方法:
CALL SET replace=%%!middle:~2,-1!%%
FOR /F %%a IN ("!middle:~2,-1!") DO SET replace=!%%a!
最后一行比前一行运行得更快...
关于windows - 如何使用延迟变量扩展从字符串中引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096886/