0

エラー ログやロールバック機能など、複数の 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 行にマルコを使用する方法はありますか? DOSKEY で試してみましたが、バッチでは機能しないようです。また、パーセント記号と感嘆符がすべてあるため、注意が必要です。どんな提案でも大歓迎です!

編集: 出力がどうあるべきかを示すために、いくつかの変数と ECHO コマンドを追加しました。有効な MsiExec コマンドライン。

4

1 に答える 1

1

私はそのようなn00bのように感じますが、基本的に、スクリプトブロックによって5行のコードを削除する方法を見つけました:

:: 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
于 2016-04-30T22:01:23.630 に答える