treedown’s Report

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

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

VBSを使わずに画面非表示のバッチファイル連続実行(最小化実行編)

VBScript終了に備えて画面非表示バッチファイルを検証してみたのでご報告です。
今回はバッチファイルの制御だけでVBSに頼らずにできるだけ画面表示を抑えた形でのバッチファイル連続実行を試してみます。

動機

以前にVBScriptを使ってバッチファイルの実行画面を表示させずに、サイレント実行したい処理を連続実行する仕組みを作りました。

■VBSを使って画面非表示でバッチファイルを連続実行してみる
https://blog.treedown.net/entry/2021/12/14/010000

このときの画面非表示はVBScriptに依存しています。「vbHide」オプションを付けてcmd /cで実行したバッチファイルは画面表示されることなく実行することができました。

しかし、このVBScriptが非推奨(Deprecated)となり、OS標準機能から削除されることが公表されました。

■Windows クライアントの非推奨の機能
https://learn.microsoft.com/ja-jp/windows/whats-new/deprecated-features

この説明によると、まずはオンデマンド機能として提供されるようになり、その後しばらくの期間を持って提供終了となるようです。

オンデマンド機能として提供されるので、追加すればしばらくは利用できる機能として継続するようです。とはいえ、従来から使っている環境でどうすれば継続利用できるかは今のところ不明ですが。一応"非推奨の機能のリソース"には「オンデマンドの VBScript 機能がプレインストールされ、中断なく使用できるようになります。」と記載はあります。

どこまで使えるか見えない状況ですので、ひとまず代替の方法を検証しておくことにしました。

検証の環境

テスト環境のWindows10に「C:\temp」フォルダを作成し、その中で動作確認をすることにしました。

ひとまず、「test.bat」ファイルを用意し、CALLコマンドで子のバッチファイルを連続実行という内容を作成しました。

これをどうすれば画面非表示の状態で、CALL指定した子のバッチファイルを連続実行するかを試すという検証です。

startコマンドの出番?

以前にstartコマンドを調べた時、[/MIN]オプションでウインドウを最小化した状態で起動するというのを試していました。(※このときはインストーラが2段階で動作したので上手くいかなかったけど)

意外と奥の深いstartコマンドを学んでみる - treedown’s Report

最初は各バッチファイルを

start /min "C:\temp\test.bat"

単純にstartコマンドから実行してみたり、

cmd /c start /min "C:\temp\test.bat" ^& exit

バッチファイルの実行が完了したタイミングでプロセス終了となるオプション=/c、を付けて"C:\temp\test.bat"を実行したり、といくつかやっていたのですが、

■バッチファイルを最小化して実行する
https://forgetmenots.doorblog.jp/archives/52556936.html

オプションを調べていくうちに、こちらを発見してこれでいいという結論に達しました。ありがとうございます。さっそく行頭の"@echo off"の直後に追加。

この構文で、最初のIF文から(最初は条件を満たさないので)startコマンド行の処理が開始、/minを付けたstartコマンドから「cmd /c」とCALLでバッチファイル(%~f0=実行されたバッチファイル自身のフルパス)を実行します。
最後にexitでIF文から処理を抜けると、最初のIF文に戻って(自分自身を起動しているから)「"%1" == "1"」の条件式を満たしてIF文以降の処理を開始します。

バッチファイルの中で"自分自身を最小化した状態で起動し直す"というのはなるほどと思いました。

対象フォルダの存在確認

以前の.vbsにはもう一つ判定があって、「イントラ内の共有フォルダが存在するかどうかを確認する」ことを動作条件の一つにしていました。

つまり、子のバッチファイルで実行するインストール処理の元となるインストーラがダウンロード可能かどうかを共有フォルダの存在確認によって判断し、共有フォルダが存在しなければ何もせずに終了させています。

--------------------------------------------------------------
strChkFolderPath = "\\FileServer\Share-F"

IF strFolderNAME.FolderExists(strChkFolderPath) Then

else

end IF
--------------------------------------------------------------
としていた部分をif existで書き換えるようにします。
--------------------------------------------------------------
if exist "\\FileServer\Share-F" (

) else (

)
--------------------------------------------------------------

else前が存在確認OKの処理、else以降は存在しなかった時のNG処理の記載になります。

バッチファイル完成

さっそくここまでで完成したバッチファイルです。

--------------------------------------------------------------
test.bat
--------------------------------------------------------------

@echo off
if not "%1" == "1" (
    start /min cmd /c call "%~f0" 1
    exit
)

pushd C:\temp

if exist "\\FileServer\Share-F" (
        CALL C:\temp\test-1.bat
        CALL C:\temp\test-2.bat
        CALL C:\temp\test-3.bat
        echo %date% %time% バッチファイルの処理が完了しました。>>.\log.txt
) else (
        echo %date% %time% 確認の結果、フォルダは存在しませんでした。>>.\log.txt
)

popd

--------------------------------------------------------------

実行すると、一瞬コマンドプロンプト画面が見えますがすぐ最小化され、タスクバーにコマンドプロンプトアイコンが表示されるだけでデスクトップ上には画面が表示されないまま、子のバッチファイルであるtest-1.bat~test-3.batが実行されていきます。

あと、画面非表示で動作が分からないので、メッセージをログファイル「C:\temp\log.txt」に書き出すことにしました。(本番で使用するときにはコメントアウトするようにします。)

 

ここまでで、バッチファイルの準備は完了です。これをタスクスケジューラに仕掛けて行くのですが、一日目はここでいったん終了です。