【问题标题】:How do I set the value of multiple variables in a macro in batch?如何批量设置宏中多个变量的值?
【发布时间】:2016-04-30 20:59:19
【问题描述】:

我正在编写一个脚本模板来安装多个 MSI,包括错误记录和回滚功能。它包含用于存储每个 MSI 的安装和卸载信息的脚本块。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:: Global Variables
SET PACKAGENAME=SysinternalsSuite
SET THISDIR=%~dp0
SET LOGFOLDER=%TEMP%\%PACKAGENAME%
IF EXIST "%LOGFOLDER%" RD "%LOGFOLDER%" /S /Q
MKDIR "%LOGFOLDER%"
SET LOGLEVEL=/lv

:: Scriptblock
SET /A INDEX=0
SET DISPLAYNAME[%I%]=SysinternalsSuite.msi
SET MSIPATH[%I%]="%thisdir%SysinternalsSuite.msi"
SET GUID[%I%]={79D7C0BA-9E50-44E8-8D0B-56D5EA692B5E}
SET ACTIONLOG[%I%]="%LOGFOLDER%\%I%_!DISPLAYNAME[%I%]!.log"
SET INSTALLCOMMAND[%I%]=MsiExec.exe /i !MSIPATH[%I%]! /qn %LOGLEVEL% !ACTIONLOG[%I%]!
SET UNINSTALLCOMMAND[%I%]=MsiExec.exe /x !GUID[%I%]! /qn
SET EXITATERROR[%I%]=1
SET ALLOWEDERROR[%I%]=3010

ECHO !INSTALLCOMMAND[%I%]!
ECHO !UNINSTALLCOMMAND[%I%]!

想法是,只需要定义 DISPLAYNAME、MSIPATH 和 GUID,块的最后 5 行将成为模板的一部分。有没有办法可以在脚本块的最后 5 行使用 marco?我已经尝试过使用 DOSKEY,但这似乎不能批量工作,而且所有的百分号和感叹号都变得棘手。任何建议将不胜感激!

编辑:添加了一些变量和 ECHO 命令,以说明输出应该是什么;有效的 MsiExec 命令行。

【问题讨论】:

  • 如果最后五个变量相同,为什么要用索引创建它们?环境变量空间有限制。
  • 该值不会相同,但安装命令和卸载命令在其他变量方面的定义相同。换句话说:行将相同,但每个 MSI 块的值最终应该不同。

标签: batch-file cmd macros doskey


【解决方案1】:

感觉自己就是这么个n00b,不过我基本弄明白了怎么去掉这五行代码,通过scriptblock来:

:: Scriptblock
SET /A INDEX=0
SET DISPLAYNAME[%I%]=SysinternalsSuite.msi
SET MSIPATH[%I%]="%thisdir%SysinternalsSuite.msi"
SET GUID[%I%]={79D7C0BA-9E50-44E8-8D0B-56D5EA692B5E}
Call :BuildCommandLines

并添加一个功能:

:BuildCommandLines
    SET ACTIONLOG[%I%]="%LOGFOLDER%\%I%_!DISPLAYNAME[%I%]!.log"
    SET INSTALLCOMMAND[%I%]=MsiExec.exe /i !MSIPATH[%I%]! /qn %LOGLEVEL% !ACTIONLOG[%I%]!
    SET UNINSTALLCOMMAND[%I%]=MsiExec.exe /x !GUID[%I%]! /qn
    SET EXITATERROR[%I%]=1
    SET ALLOWEDERROR[%I%]=3010
goto :eof

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多