寒くなってきました。そろそろ情シス社員がPCキッティングに勤しむ季節ですね。
今回は、効率的にキッティングするためにソフトウェアのインストールを自動化するバッチファイルの作り方を解説します。
共有フォルダなどにインストーラーを格納
バッチファイルと同じ階層にフォルダを作成します。今回はフォルダ名「installer」としました。
バッチファイル
ローカル上(USBメモリなど)で実行する場合
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0
rem 管理者権限で実行
openfiles > nul
if "%1"=="" (
set arg=
) else (
set arg= -ArgumentList "%1"
)
if errorlevel 1 (
PowerShell.exe -Command Start-Process \"%~f0\"%arg% -Verb runas
exit
)
rem OSのbit数確認
set x86_mode=FALSE
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" set x86_mode=TRUE
rem ビットモード手動設定(引数1に32で32bitモード)
if "%1"=="32" set x86_mode=TRUE
rem インストーラー格納先フォルダ設定
set inst=installer\
rem インストールコマンドを設定(サイレントインストールできるように引数も指定しておく)
set DotNET35="Dism /online /enable-feature /featurename:NetFX3 /all /Source:%inst% /limitaccess /norestart"
set DirectX=""%inst%DirectX\DXSETUP.exe" /silent"
set Seven-Zip=""%inst%7z2301-x64.exe" /S"
set VLC=""%inst%vlc-3.0.20-win64.exe" /S"
set GoogleChrome="msiexec /i "%inst%googlechromestandaloneenterprise64.msi" /quiet /norestart"
set Acrobat=""%inst%AcroRdrDC2100120155_ja_JP.exe" /sPB /rs /rps /l"
set Office="%inst%office365\Install_Office365.bat"
if %x86_mode%==TRUE (
echo ◆◆◆32bit モード◆◆◆
echo このスクリプトは32bit OSには対応していません。手動でインストールしてください。
pause
exit /b 0
) else (
echo ◆◆◆64bit モード◆◆◆
)
call :do_install ".NET Framework 3.5" %DotNET35% "FALSE"
call :do_install "DirectX 9.0c" %DirectX% "FALSE"
call :do_install "7-Zip" %Seven-Zip% "C:\Program Files\7-Zip\7zFM.exe"
call :do_install "VLC media player" %VLC% "C:\Program Files\VideoLAN\VLC\vlc.exe"
call :do_install "Google Chrome" %GoogleChrome% "C:\Program Files\Google\Chrome\Application\chrome.exe"
call :do_install "Acrobat Reader" %Acrobat% "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
call :do_install "Office 365" %Office% "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
pause
exit /b 0
:do_install
echo %~1 をインストール
if exist %3 (
echo 既にインストールされているためスキップします。
) else (
call %~2
if errorlevel 0 (
echo 完了
) else (
echo エラーが発生しました: 終了コード %errorlevel%
)
)
exit /b 0
ネットワーク上の共有フォルダから実行する場合
@echo off
setlocal enabledelayedexpansion
rem cdはネットワークパスを指定できないため、pushd…popdで回避
pushd %~dp0
rem 管理者権限で実行
openfiles > nul
if "%1"=="" (
set arg=
) else (
set arg= -ArgumentList "%1"
)
if errorlevel 1 (
PowerShell.exe -Command Start-Process \"%~f0\"%arg% -Verb runas
exit
)
rem OSのbit数確認
set x86_mode=FALSE
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" set x86_mode=TRUE
rem ビットモード手動設定(引数1に32で32bitモード)
if "%1"=="32" set x86_mode=TRUE
rem インストーラー格納先フォルダ設定
set inst=installer\
rem インストールコマンドを設定(サイレントインストールできるように引数も指定しておく)
set DotNET35="Dism /online /enable-feature /featurename:NetFX3 /all /Source:%inst% /limitaccess /norestart"
set DirectX=""%inst%DirectX\DXSETUP.exe" /silent"
set Seven-Zip=""%inst%7z2301-x64.exe" /S"
set VLC=""%inst%vlc-3.0.20-win64.exe" /S"
set GoogleChrome="msiexec /i "%inst%googlechromestandaloneenterprise64.msi" /quiet /norestart"
set Acrobat=""%inst%AcroRdrDC2100120155_ja_JP.exe" /sPB /rs /rps /l"
set Office="%inst%office365\Install_Office365.bat"
if %x86_mode%==TRUE (
echo ◆◆◆32bit モード◆◆◆
echo このスクリプトは32bit OSには対応していません。手動でインストールしてください。
pause
exit /b 0
) else (
echo ◆◆◆64bit モード◆◆◆
)
call :do_install ".NET Framework 3.5" %DotNET35% "FALSE"
call :do_install "DirectX 9.0c" %DirectX% "FALSE"
call :do_install "7-Zip" %Seven-Zip% "C:\Program Files\7-Zip\7zFM.exe"
call :do_install "VLC media player" %VLC% "C:\Program Files\VideoLAN\VLC\vlc.exe"
call :do_install "Google Chrome" %GoogleChrome% "C:\Program Files\Google\Chrome\Application\chrome.exe"
call :do_install "Acrobat Reader" %Acrobat% "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
call :do_install "Office 365" %Office% "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
popd
pause
exit /b 0
:do_install
echo %~1 をインストール
if exist %3 (
echo 既にインストールされているためスキップします。
) else (
call %~2
if errorlevel 0 (
echo 完了
) else (
echo エラーが発生しました: 終了コード %errorlevel%
)
)
exit /b 0
コマンドの解説
バッチをネットワーク上に配置した場合
バッチをネットワーク上の共有フォルダに配置すると、各PCから容易にアクセスできて便利ですが、3行目のcdでは \\192.168.0.1 などから始まるネットワークパスを指定できずエラーになります。
この問題はpushd…popdコマンドで回避できます。指定したパスを一時的にネットワークドライブに設定して、popdで切断します。
pushd %~dp0
…
popd
OSのbit数を確認して分岐する
実行中のOSが32bit版か64bit版か判定し、分岐するためのコマンドです。3~4行目はデバッグ用ですので、不要なら入れなくても大丈夫です。
set x86_mode=FALSE
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" set x86_mode=TRUE
rem ビットモード手動設定(引数1に32で32bitモード)
if "%1"=="32" set x86_mode=TRUE
if %x86_mode%==TRUE (
echo ◆◆◆32bit モード◆◆◆
rem ここに32bit用のインストールコマンドを記載
) else (
echo ◆◆◆64bit モード◆◆◆
rem ここに64bit用のインストールコマンドを記載
)
rem ここに共通のインストールコマンドを記載
最近のOSは64bit版ばかりですので、あえて32bitに対応せず、そのまま終了させることも可能です。
if %x86_mode%==TRUE (
echo ◆◆◆32bit モード◆◆◆
echo このスクリプトは32bit OSには対応していません。手動でインストールしてください。
pause
exit /b 0
) else (
echo ◆◆◆64bit モード◆◆◆
)
インストールコマンド
以下のコマンドをインストールしたいソフトウェアの分だけ入れることで、次々インストール作業を行います。
call :do_install "表示するソフト名" "実行するファイルとコマンド" "既インストールチェック用パス"
ファイルとコマンド部分
便宜上、コマンド部分を独立して変数に格納しました。サイレントインストールや再起動抑制の引数を調べておきましょう。
rem インストールコマンドを設定(サイレントインストールできるように引数も指定しておく)
set DotNET35="Dism /online /enable-feature /featurename:NetFX3 /all /Source:%inst% /limitaccess /norestart"
set DirectX=""%inst%DirectX\DXSETUP.exe" /silent"
set Seven-Zip=""%inst%7z2301-x64.exe" /S"
set VLC=""%inst%vlc-3.0.20-win64.exe" /S"
set GoogleChrome="msiexec /i "%inst%googlechromestandaloneenterprise64.msi" /quiet /norestart"
set Acrobat=""%inst%AcroRdrDC2100120155_ja_JP.exe" /sPB /rs /rps /l"
set Office="%inst%office365\Install_Office365.bat"
実行部分
上記で設定したコマンドを実行する部分です。
指定したファイルが存在する場合は既にインストールしているとみなし、そのソフトウェアのインストーラー実行をスキップするようにしています。
:do_install
echo %~1 をインストール
if exist %3 (
echo 既にインストールされているためスキップします。
) else (
call %~2
if errorlevel 0 (
echo 完了
) else (
echo エラーが発生しました: 終了コード %errorlevel%
)
)
exit /b 0
自動的に管理者権限で実行する
自動的に管理者権限で実行するコマンドの解説はこちら