バッチの注意点
IF文
例)小文字aaaを持つ環境変数var0をDefinedでの確認後に大文字AAAへ置換する場合
SET var0=aaa
IF DEFINED var0 (
 SET var0=%var0:a=A%
 ECHO %var0%
)
上記だとIF文のブロック内部からは置換後の値をECHOできない。これは、FOR文等のブロック内部を実行前に一括展開するため。
そのため、var0は正しく置換されても置換後の値をブロック要素内部からは既に置換前で展開されているために使えない。
これは、下記のようにIF文のブロック外にECHOを出すか、遅延環境変数(%の代わりに!で括る)を使うことで表示出来る。
遅延環境変数を使うためには、SETLOCALのENABLEDELAYEDEXPANSIONオプションを使うか、cmd.exe /v:onのオプションが必要。
FOR文のブロック要素外に出す場合
SET var0=aaa
IF DEFINED var0 (
 SET var0=%var0:a=A%
)
ECHO %var0%
遅延環境変数を利用する場合(SETLOCAL ENABLEDELAYEDEXPANSIONにて利用)
SETLOCAL ENABLEDELAYEDEXPANSION
SET var0=aaa
IF DEFINED var0 (
 SET var0=%var0:a=A%
ECHO !var0!
)
ENDLOCAL

修正パッチ一括インストール(スクリプト)
Microsoft Download Centerにて修正パッチを事前にダウンロードする。
以下のauto_install.vbs(権限自動昇格用)及びauto_install.bat(修正パッチ連続実行用(XPも対応))を修正パッチと同じディレクトリ内に置き、auto_install.vbsを実行する。

auto_install.vbs
option explicit
Dim wmi,os,value,wsh,sha,sfo
Set sfo=CreateObject("Scripting.FileSystemObject")

do while WScript.Arguments.Count=0 and WScript.Version>=5.7

  'Check if Vista
  Set wmi = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
  Set os = wmi.ExecQuery ("SELECT * FROM Win32_OperatingSystem")
  For Each value in os
    if left(value.Version,3)<6.0 then exit do 'Exit if not Vista
  Next

  'Run this script as admin.
  Set sha=CreateObject("Shell.Application")
  sha.ShellExecute "wscript.exe",""""+WScript.ScriptFullName+""" vista","","runas"

  WScript.Quit
loop

'Current directory may be moved to system32, maybe not.
Dim strScriptPath
strScriptPath = Replace(WScript.ScriptFullName, WScript.ScriptName,"")

Set wsh=CreateObject("WScript.Shell")
wsh.run  """" & strScriptPath & "auto_install.bat" & """"

auto_install.bat
@ECHO OFF
SETLOCAL
ECHO Install Hotfix? :(y/n) default:n
SET /p Input=
IF '%ERRORLEVEL%'=='1' (GOTO END)
IF /i "%Input%"=="y" (GOTO OS_CHECK) ELSE (GOTO END)
rem *****************************************************************
:OS_CHECK
VER | FIND /c "XP" > NUL
 IF '%ERRORLEVEL%'=='0' (GOTO INSTALL_XP)
VER | FIND /c "6." > NUL
 IF '%ERRORLEVEL%'=='0' (GOTO INSTALL_VISTA)
GOTO END
rem *****************************************************************
:INSTALL_VISTA
ECHO Installing Hotfix (msu)...
CD /d %~dp0
FOR %%a IN (*.msu) DO (
	ECHO Installing %%a
	%%a /quiet /norestart
)
ECHO Do you want to reboot now? :(y/n) default:n
SET /p Input=
IF '%ERRORLEVEL%'=='1' (GOTO END)
IF /i "%Input%"=="y" (GOTO REBOOT_VISTA)
GOTO END
rem *****************************************************************
:INSTALL_XP
ECHO Installing Hotfix (exe)...
CD /d %~dp0
FOR %%a IN (*.exe) DO (
	ECHO Installing %%a
	%%a /quiet /norestart
)
ECHO Do you want to reboot now? :(y/n) default:n
SET /p Input=
IF '%ERRORLEVEL%'=='1' (GOTO END)
IF /i "%Input%"=="y" (GOTO REBOOT_XP)
GOTO END
rem *****************************************************************
:REBOOT_VISTA
SHUTDOWN /r /t 0
GOTO END
rem *****************************************************************
:REBOOT_XP
SHUTDOWN -r -t 0
GOTO END
rem *****************************************************************
:END
ENDLOCAL
EXIT /b %ERRORLEVEL%
最終更新:2012年11月24日 19:48