こんにちは!
今回は、Windows環境でGUIを使わずに、batファイルとps1スクリプトを使用して、起動時にアプリケーションを自動でインストールする方法についてご紹介します。
多くのWindows PCにアプリケーションをインストールする必要がある場合等に活用できると思いますので、ご参考になれば幸いです。
前提
今回は例として、「Trend Micro Apex One」をWindows PCにインストールするケースを考えます。
インストールに必要なファイルは以下の通りです。
- batファイル(AutoInstallApp.bat)※「batファイルの準備」参照
- ps1スクリプトファイル(AutoInstallApp.ps1)※「ps1スクリプトの準備」参照
- アプリケーションのインストーラー
各ファイルは「C:\Installfolder」に配置します。
自動インストールの流れ
今回、アプリケーションを自動インストール際の流れは以下の通りとなります。
- セッションホスト起動時にタスクスケジューラーが実行される
- タスクスケジューラーによって、batファイルを実行する
- batファイルによって、ps1スクリプトを実行する
- アプリケーションがインストールされているかを判定する ※インストールされている場合は、No.6の手順に進む。
- インストールがされていない場合は、インストールを行う
- インストールが確認されたら、イベントログを出力する
各手順の詳細を解説します。
batファイルの準備
今回は、batファイルから別途用意したps1ファイルを呼び出すことでスクリプトを実行します。
batファイルの内容はこのようになっています。
@echo off
powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Installfolder\AutoInstallApp.ps1"
「-ExecutionPolicy」を使用し、PowerShellの実行ポリシーを「Bypass」としてスクリプトを実行させています*1
また、スクリプトをバックグラウンドで実行させるため、ユーザーにウィンドウが表示されないように「-WindowStyle」の「Hidden」オプションを使用しています
ps1スクリプトの準備
全体のコード
まず、全体のコードを記載します。
$ApexOneeventSource = "ApexOneInstall"
# ApexOneのイベントログソースが存在しない場合は新規作成
if (-not [System.Diagnostics.EventLog]::SourceExists($ApexOneeventSource)) {
New-EventLog -LogName $eventLogName -Source $ApexOneeventSource
}
for ($i = 0; $i -lt 5; $i++) {
#ApexOneがインストールされているか確認
$ApexOnepath = Test-Path -Path "Registry::HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ApexOneNT"
# ApexOneがインストールされていない場合はApexOneをインストール
if (-not($ApexOnepath)) {
C:\Installfolder\AppInstaller_x64.exe
#インストールの待機処理
$proc = Get-Process -Name "AppInstaller_x64"
Wait-Process -Id $proc.id
} else {
#イベントログの有無確認
$GetLog = Get-EventLog -LogName Application -Source 'ApexOneInstall' -Message *ApexOneのインストールが完了しました。*
if($GetLog -eq $null){
# ApexOneインストール完了をイベントログに記録
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$message = "${time}: ApexOneのインストールが完了しました。"
Write-EventLog -LogName $eventLogName -Source $ApexOneeventSource -EventId 0 -EntryType Information -Message $message
break
}
else{
break
}
}
}
主なポイントです。
- 指定されたアプリケーションがインストールされているかを確認し、されていない場合のみインストーラーを実行します
- アプリケーションのインストールが完了した時に、イベントビューアーにイベントログを出力させます
上記ポイント含め、スクリプトのそれぞれの処理について解説します。
アプリケーションのインストール有無の確認
レジストリに該当のアプリケーション名があるかどうかで、アプリケーションの有無を判断します。
#ApexOneがインストールされているか確認
$ApexOnepath = Test-Path -Path "Registry::HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ApexOneNT"
「Test-Path」はファイルやフォルダの存在を確認するコマンドです。
引数にチェックしたいファイルやフォルダのパスを指定すると、存在する場合はTrue、存在しない場合はFalseが戻ります。
インストーラーの実行
アプリケーションをインストールするために.exeファイルを実行します。
# ApexOneがインストールされていない場合はApexOneをインストール
if (-not($ApexOnepath)) {
C:\Installfolder\AppInstaller_x64.exe
}
すでにインストールされている場合は、exeファイルの実行はスキップされます。
インストールの待機処理
アプリケーションのインストールが完了する前に後続の処理(イベントログ出力)が実行されることを防ぐため、インストールの待機処理を行います。
#インストールの待機処理
$proc = Get-Process -Name "AppInstaller_x64"
Wait-Process -Id $proc.id
「Wait-Process」は指定したプロセスが停止するまで待機するコマンドです。
インストーラーの実行プロセスを確認後、プロセス停止まで待機します。プロセスが停止したら後続の処理に進みます。
イベントログの出力
インストール完了のイベントログをイベントビューアーに出力します。
$ApexOneeventSource = "ApexOneInstall"
# ApexOneのイベントログソースが存在しない場合は新規作成
if (-not [System.Diagnostics.EventLog]::SourceExists($ApexOneeventSource)) {
New-EventLog -LogName $eventLogName -Source $ApexOneeventSource
}
# ApexOneインストール完了をイベントログに記録
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$message = "${time}: ApexOneのインストールが完了しました。"
Write-EventLog -LogName $eventLogName -Source $ApexOneeventSource -EventId 0 -EntryType Information -Message $message
「New-EventLog」でイベントソースを新規作成し、「Write-EventLog」でイベントログを出力します。
イベントログ出力結果
イベントログの出力結果例は下記の通りです。

タスクスケジューラーによるbatファイルの実行
Windowsのタスクスケジューラーを使用して、作成したbatファイルを定期的に実行する設定を行います。
今回は、Windowsの起動時にbatファイルを自動実行する設定手順をご紹介します。
- タスクスケジューラーを起動して、[タスクの作成]をクリックします。

- [全般]タブにて、タスクの名前とタスク実行時のアカウントを設定します。

- [トリガー]タブにて、[新規]をクリックして[タスクの開始]を[スタートアップ時]に設定します。


- [操作]タブにて、[新規]をクリックして[プログラム/スクリプト]項目に作成したbatファイルを指定します。


- [条件][設定]タブは既定値のまま[OK]をクリックします。
おわりに
本記事では、Windowsの起動時アプリケーションを自動でインストールする手順についてご紹介しました。
アプリケーションによって情報を取得するコマンド等が変わる可能性はありますが、他のアプリケーションインストールにも応用できるかと思います。
少しでもご参考になれば幸いです!
*1:制限なしでスクリプトを許可することとほぼ同義となります