C# VBScript アプリケーション開発

【C#】【VBScript】アプリケーションの自動再起動

投稿日:

このページの内容

この機能を作成した理由

24H稼働している工場等のクラサバ系のシステムで、サーバー側ソフトが原因不明のハングアップをしてしまい、夜中に呼び出しを受けてしまったという経験があるシステム担当者は少なからずいるかと思います。
※私の場合は時折夜中に呼び出されて、原因を探っていたらサーバー側のソフトがハングアップしてしまっており、アプリケーションの再起動だけで解決したということが何度かありました(泣)

そんなハングアップ時に自動で、アプリケーションの強制終了 → 再起動 を実現する機能を作成してみました。

ソースコード

exeと同一フォルダに、強制再起動するVBScriptを作成して実行させます。
どこに組み込むのかは、開発者の皆様にお任せいたします。
※この処理の直前に再起動が実行した旨を知らせるメール処理等を追加すると、再起動の事実に気付けるので、さらなる調査などが出来ると思います。

/// <summary>
/// VBScriptを利用して、プロセスを強制的に再起動します。
/// </summary>
private void ForceRestart()
{
    string exePath = System.Reflection.Assembly.GetEntryAssembly().Location;  //自己プロセスのexeのフルパスを取得
    string processName = System.IO.Path.GetFileName(exePath);   //exe名を取得
    string scriptPath = System.IO.Path.GetDirectoryName(exePath) + @"\ForceRestart.vbs";

    //再起動用のVBScriptファイルが存在する場合は、削除しておく
    //削除せずにファイルが存在する場合はもちろんそのまま実行してもよいです
    if (System.IO.File.Exists(scriptPath))
        System.IO.File.Delete(scriptPath);

    System.IO.StreamWriter stWriter;
    string vbScript;    //実行するscriptを用意する

    vbScript = "Option Explicit" + Environment.NewLine;
    vbScript += "On Error Resume Next" + Environment.NewLine;    //エラーが発生しても処理を継続する
    vbScript += "Dim procName" + Environment.NewLine;  //強制終了させるプロセス名
    vbScript += "Dim procList" + Environment.NewLine;  //全プロセスを読み込ませる
    vbScript += "Dim proc" + Environment.NewLine;      //個別のプロセス
    vbScript += "Dim wShell" + Environment.NewLine;    //exeを再起動させる

    vbScript += "procName=\"" + processName + "\"" + Environment.NewLine;   //終了させるプロセスとして、自己exeを指定する

    vbScript += "Set procList=GetObject(\"winmgmts:\").InstancesOf(\"win32_process\")" + Environment.NewLine; //win32のプロセスを取得する
    vbScript += "For Each proc In procList" + Environment.NewLine;
    vbScript += "  If proc.Name=procName Then" + Environment.NewLine;
    vbScript += "    proc.Terminate" + Environment.NewLine;     //終了処理
    vbScript += "  End If" + Environment.NewLine;
    vbScript += "Next" +Environment.NewLine;
    vbScript += "Set procList=Nothing" + Environment.NewLine;

    vbScript += "WScript.Sleep 3000" + Environment.NewLine;   //念のため3sec待機させてからプロセスを起動する

    //ここからexeの起動処理
    vbScript += "Set wShell=CreateObject(\"WScript.Shell\")" + Environment.NewLine;
    vbScript += "wShell.Run \"" + exePath + "\"" + Environment.NewLine;
    vbScript += "Set wShell=Nothing";

    //VBScriptを書き込む
    //Encodingを指定しないと、UTF-8で書き込むが、UTF-8ではVBScriptが動かないので、SJISを指定
    stWriter = new System.IO.StreamWriter(scriptPath, false, Encoding.GetEncoding("Shift_JIS"));            stWriter.Write(vbScript);
    stWriter.Close();


    //強制再起動のVBScriptを実行する
    System.Diagnostics.Process.Start(scriptPath);
}

この機能を組み込むことによって、システム担当者の夜中対応がちょっとでも削減されるなら本望です。

Follow me!

-C#, VBScript, アプリケーション開発
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

関連記事

VisualStudio2019でSQLiteを利用する(NuGetパッケージのインストール)

このページでは、VisualStudio2019にてNuGetパッケージのインストールによってSQLiteを利用するための手順を紹介しています。DLLをダウンロードして、参照設定にて利用される方法はこ …

VisualStudio2019でSQLiteを利用する(SQLite.orgからDLLをダウンロード)

このページでは、Visual Studio 2019にてインストール等の作業が不要な実行ファイル配布型のWindowsアプリでSQLiteを利用するためにあれこれ必要な点をまとめています。 すでにSQ …

no image

MP4ファイルから字幕データの抽出

このページでは、Windows10にてffmpegとPowershellを利用して、MP4ファイルから字幕データを抽出する方法を説明しています。 使用するMP4ファイルについてffmpegの取得と字幕 …

no image

【VBScript】管理者権限でVBScriptを実行させる

このページの内容 どんな時にこの機能が必要になるかソースコード どんな時にこの機能が必要になるか このページのタイトルにある通りですが、管理者権限が必要になるフォルダ内のファイルの編集などをVBSri …

GASの利用 ~スプレッドシートの値が取得できない or 想定と異なる場合~

getValuesでスプレッドシートの値を取得しようとした際に、・値が取得できない・取得した値が想定していたものと違うという状況に遭遇した場合について、このページでは記載しています。 ※このページの …

このサイトの管理者について

1980年代生まれ
石川県在住

メーカー2社経験後に退社

1年程度自由に在職中はできなかったことにチャレンジ

その後コロナの影響でなかなか仕事が見つかりませんでしたが、無事就職

現在はシステム会社に勤務中

PAGE TOP