如何批量设置宏中多个变量的值?

时间:2016-04-30 20:59:19

标签: batch-file cmd macros doskey

我正在编写一个脚本模板来安装多个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行将是模板的一部分。有没有办法可以在marblock的最后5行使用marco?我已尝试使用DOSKEY,但这似乎不是批量工作,并且所有的百分号和感叹号,它变得棘手。任何建议将不胜感激!

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

1 个答案:

答案 0 :(得分: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