windows - 如何使用延迟变量扩展从字符串中引用变量

标签 windows batch-file cmd

我正在尝试创建一个小脚本来执行轻型模板替换任务,但我无法按照我想要的方式取消引用变量。

这是我的模板替换批处理文件:

@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/

相关文章:

windows - 如何扩展 CMD shell 变量两次(递归)

windows - 为什么从 PowerShell 运行的 Perl 脚本可以在新控制台中运行,而 Python 脚本却不能?

cmd - 如何解决 doskey 的特殊字符,如 $L

python - 如何使我的 Python 脚本成为系统命令并在 Windows 的任何目录中轻松运行它?

linux - 如何在具有 Windows (PE) 目标的 Linux 机器上交叉编译 haskell 程序?

batch-file - Powershell ISE - 如何通过命令启动新选项卡

batch-file - Windows批处理是否支持异常处理?

c++ - 如何使用 C/C++ 检索可移动存储盘符

python - 如何在 Windows 上的 postgresql 9.4 上使用扩展 plpython2u 和 python 请求

javascript - 如何使用批处理文件循环 imacro 脚本