バッチの注意点
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.vbsoption 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%