treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

バッチファイルでインストールEXE実行

今日はちょっとしたEXEファイル実行に使えるバッチファイルをご報告します。
UNCパスから直接実行できないインストール作業などで使ったバッチファイルです。

もともとはSSID追加のために共有フォルダに配置したSMRTNTKYフォルダのSSID設定をsetupSNK.exeで自動実行するために用意したバッチファイルです。
ですが、昨日の記事、

treedown.hatenablog.jp

ここに記載のある通りWindows8以降ではこの方法が使えなくなったので、このバッチファイルもSSID追加には使えなくなってしまいました…。
とはいえ、共有フォルダ上に配置したEXEファイルがユーザ権限で実行可能だがUNCパスをソースに使えないインストーラの場合や、何かしらの方法で権限代行し共有フォルダ上に配置したEXEファイルをSYSTEM権限で動作させる場合には使える方法です。

バッチファイルが参照するEXEファイルを保管した共有フォルダは例によって\\FILSVR\Shareに保管している前提です。

ざっくりとした動きをご説明しておきます。
動作のためにc:\tempを使います。c:\tempに一時利用する動作ファイル一式を保管して、実行し終わったら削除をする、という動きをします。
一時保管場所としてc:\temp配下にフォルダを作成します。
xcopyコマンドで\\FILSVR\Share配下に保管してある実行ファイル一式をc:\temp配下にコピーします。このコピーファイルの容量が多いとここで多少待たされることになります。
substコマンドでフォルダにドライブレターを割り当てて、インストールドライブにします。これによってUSBメモリで実行しているのと同じような環境にします。このコマンドでドライブレターを割り当てることで、UNCパスから直接実行できないEXEファイル実行を実現させます。例ではUドライブを使うことになります。
実行は変数<EXEFILE>に代入したファイル名(U:\にあることが前提)を実行します。
実行が完了すると「subst u: /D」でUドライブを解除します。(ドライブレターが削除されます。)
完了後、rmdirコマンドで一時保管場所として用意したc:\temp配下のフォルダを削除します。
最後に使用した環境変数をクリアして終了します。

バッチファイルです。
実行条件は、「c:\temp」が使えることと、「Uドライブ」が別のデバイスに割り当てられていないこと、の2点です。
共有フォルダ上では、「\\FILSVR\Share\WLANcnf」配下に「HomeSSID」フォルダが存在していて「\\FILSVR\Share\WLANcnf\HomeSSID」内に「SMRTNTKY」フォルダと「setupSNK.exe」が保管されている、という状態が前提です。
バッチファイルはSSID追加のための「setupSNK.exe」を実行する前提の作りになっていますので、適宜編集する必要があります。
----------------------------------------------
EXEファイルを実行するバッチファイル
----------------------------------------------
@echo off

rem 追加するSSIDのフォルダ名
set SSIDFolder=HomeSSID
rem 実行するEXEファイル名
set EXEFILE=setupSNK.exe

mkdir c:\temp\WLANconf\%SSIDFolder%
SET COPYCMD=/Y
xcopy /E /H "\\FILSVR\Share\WLANcnf\%SSIDFolder%" c:\Temp\WLANconf\%SSIDFolder%
SET COPYCMD=
subst u: c:\Temp\WLANconf\%SSIDFolder%
u:\%EXEFILE%
echo Y|subst u: /D
rem echo Y|rmdir /S /Q c:\temp\WLANconf
rmdir /S /Q c:\temp\WLANconf
set SSIDFolder=
set EXEFILE=
----------------------------------------------

ちょっと粗いですが、こんな感じです。
ちょこっと編集してSSID追加ではない汎用的な作りにしてみましょうか。
----------------------------------------------
EXEファイルを実行するバッチファイルその2
----------------------------------------------
@echo off

rem 一次作成フォルダ名
set EXEFolder=ExecFiles
rem 実行するEXEファイル名
set EXEFILE=setup.exe

mkdir c:\temp\%EXEFolder%
SET COPYCMD=/Y
xcopy /E /H "\\FILSVR\Share\%EXEFolder%" c:\Temp\%EXEFolder%
SET COPYCMD=
subst u: c:\Temp\%EXEFolder%
u:\%EXEFILE%
echo Y|subst u: /D
rem echo Y|rmdir /S /Q c:\temp\%EXEFolder%
rmdir /S /Q c:\temp\%EXEFolder%
set SSIDFolder=
set EXEFILE=
----------------------------------------------

動作テストはしていないので、事前に入念な動作確認をお願いします。