treedown’s Report

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

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

VBScriptで共有フォルダ接続有無で処理の分岐をしてみる

バッチファイルからちょっと外れますが、VBScriptをちょっと学んだのでご報告です。
VBScriptで共有フォルダの接続確認をしてみました。

動機

前回「VBSを使って画面非表示でバッチファイルを連続実行してみる - treedown’s Report」にて、バッチファイルを画面非表示実行するためにVBScriptからバッチファイルを呼び出して、目的を達成しました。

このとき作成したAutoUpd.vbsに「インストール元となるネットワーク上の共有フォルダにアクセス可能なときだけバッチファイルを実行する」という判定条件を加えたいと思い、今回ちょっとやってみることにしました。

共有フォルダの有無を判定

VBScriptではファイルとフォルダは明確に区別して取り扱われるらしく、オブジェクトのFolderExistsメソッドとFileExistsメソッドが用意されており、フォルダの場合にはFolderExistsメソッドを使って存在を判定するようです。

ちょっとやってみました。

--------------------------------------------------------------
ShrFolCHK.vbs
--------------------------------------------------------------
Dim strFolderNAME
Dim strReturnValue
Dim strChkFolderPath
Set strFolderNAME = CreateObject("Scripting.FileSystemObject")

strChkFolderPath = "\\FileServer\ShareFolder"

strReturnValue = strFolderNAME.FolderExists(strChkFolderPath)
MsgBox strReturnValue

IF strFolderNAME.FolderExists(strChkFolderPath) Then
       '共有フォルダに接続可能なときの処理
       Msgbox "共有フォルダにアクセス可能です"
else
       '共有フォルダに接続できないときの処理
       Msgbox "共有フォルダに接続できません"
end IF
--------------------------------------------------------------

最初のDimとSet行は変数の宣言とファイルシステムオブジェクトを作成しています。
宣言した変数のうち「strChkFolderPath」に、存在の有無を判定したい共有フォルダのパス<\\FileServer\ShareFolder>を代入。

「strFolderNAME.FolderExists(strChkFolderPath)」でTrue/Falseの判定をして、「strReturnValue」にTrueかFalseを格納しています。この判定にFolderExistsを使用。
格納したstrReturnValueをMsgBox命令で画面表示。

次のIF文で上記と同じように判定して、処理を分岐させています。
True(真)なら「共有フォルダにアクセス可能です」と表示
False(偽)なら「共有フォルダに接続できません」と表示
end IFで終了。

実行してみると、<\\FileServer\ShareFolder>に接続可能であれば、

f:id:treedown:20211216171458p:plain
と表示されて、次いで

f:id:treedown:20211216171513p:plain

と画面に表示されます。一方、<\\FileServer\ShareFolder>が存在しないパスであれば、

f:id:treedown:20211216171532p:plain

と表示された後に、

f:id:treedown:20211216171541p:plain

と画面に表示されます。

ちなみに、FolderExistsをFileExistsに置き換えれば、ファイルの存在確認をすることもできます。

前回のVBScriptに組み合わせてみる

前回「VBSを使って画面非表示でバッチファイルを連続実行してみる - treedown’s Report」のVBScriptは単純に処理を並べただけのものです。
今回の判定を組み合わせるには、共有フォルダに接続可能なときの処理の判定後の処理にバッチファイルの連続実行が来るようにすれば良いことになります。

DimやSet行は寄せて、以下のように組み合わせてみました。

--------------------------------------------------------------
AutoBat.vbs
--------------------------------------------------------------
Dim strFolderNAME
Dim strReturnValue
Dim strChkFolderPath
Dim auexWShell

Set strFolderNAME = CreateObject("Scripting.FileSystemObject")
Set auexWShell = CreateObject("WScript.Shell")

strChkFolderPath = "\\FileServer\ShareFolder"

IF strFolderNAME.FolderExists(strChkFolderPath) Then
       '共有フォルダに接続可能なときの処理
       auexWShell.run "cmd /c C:\Users\user-1\AutoUpdate\VLCupdate.bat", vbHide
       auexWShell.run "cmd /c C:\Users\user-1\AutoUpdate\7Zupdate.bat", vbHide
       auexWShell.run "cmd /c C:\Users\user-1\AutoUpdate\CubePVerUp.bat", vbHide
       auexWShell.run "cmd /c C:\Users\user-1\AutoUpdate\CubeUVerUp.bat", vbHide
       Set auexWShell = Nothing
else
       '共有フォルダに接続できないときの処理
       '何もせずに終了
end IF
--------------------------------------------------------------

各バッチファイル(VLCupdate.batや7Zupdate.batなど)は<\\FileServer\ShareFolder>を参照しています。<\\FileServer\ShareFolder>で共有されているvlc-0.0.00-win64.exeとか7z2106-x64.exeのようなインストール用のexeファイルをバッチファイルから実行することで、バージョンアップを実施しています。

ただ、ノートPCのように持ち運びするようなデバイスで前回スクリプトを利用する場合には今回の判定が活きてきます。
ファイルサーバが参照できない外部のネットワークでPCを起動したときはバッチ内で実行するはずのexeファイルは当然参照できないため、共有フォルダにアクセス可能かどうかを判定条件としてバッチファイルを連続実行するかどうかを決めることで、エラーにせずに正常終了するようにしました。

あと、「strReturnValue = strFolderNAME.FolderExists(strChkFolderPath)」行はよく考えたら必要なかったな、と思い、本番スクリプトでは削除しました。

テストは、「echo %0>>testLog1.txt」とだけ記載したバッチファイル(test1.bat~test5.bat)を複数用意し、実際のバッチファイルに代えて実行してみることで動作確認しました。