時間に基づいてサービスを開始および停止するWSH / JScript?
-
30-09-2019 - |
質問
これを行う最も簡単な方法で私の評価が正しいかどうかを確認したいだけです。
バックグラウンド: :サービスを介して実行されているソフトウェアスイートがあります。サービスは午後10時から午前6時までシャットダウンする必要があります。また、10分ごとにチェックして、彼らが登場することになっているときにダウンした場合に備えて、サービスを回復する必要があります。
選択肢: :10分ごとにWSH / JScriptを実行するスケジュールされたタスクを考えています。 jscriptのpseduoコードは次のようなものです。
- 現在の時間を取得します
- 現在の時刻が午後10時以降であるが午前6時前の場合
- sulsuredowntime()を呼び出す
- そうしないと
- suresuptime()を呼び出す
- sursedownime():
- サービスが実行されている場合は、停止してください
- suresuptime():
- サービスが実行されていない場合は、それらを起動します
質問:
- スケジュールされたタスク / wsh / jscriptは、これを行うための最良の方法ですか、それとも少なくとも受け入れられる方法ですか?
- 新しい日付()を呼び出し、.gethours()を使用するのはなぜですか?
- 私の擬似コードはこれにアプローチするための最良の方法のように見えますか?
- サービスの状態(ランニング /ランニング)を検出するにはどうすればよいですか?
- または、この場合、州に関係なくサービスを開始 /停止する必要がありますか?エラーがなく、すでに開始されているサービスを再起動しない場合、「ネットスタート」と「ネットストップ」を使用できると思います。
あなたが与えることができる助けを前もってありがとう!
解決
理解した!
ソリューションウォークスルー
- まず、スケジュールされたタスクを作成し、.batファイルを指します(.jsを直接指すとは機能しません)。
- バッチファイルで.jsファイルをポイントして実行します(たとえば、私のものは「d: bf_ping.js」にありました
bf_ping.bat:
D:
cd\
BF_Ping.js
- 次に、JavaScriptファイルを作成します。私の完全にコメントされたファイルは、参照のために以下にあります。
bf_ping.js:
//*** Time Variables ***//
var UptimeBeginsAtHour = 6; // Hour at which the services should be started
var UptimeEndsAtHour = 22; // Hour at which the services should be ended
//*** Flags ***//
var KILL_FLAG = FindFile("C:\\BF_KILL.txt"); // If this flag is true, services will be shut down and not started.
var LAZY_FLAG = FindFile("C:\\BF_LAZY.txt"); // If this flag is true, nothing in the script will run.
if (KILL_FLAG == true)
{
StopBizFlowServices();
}
if (KILL_FLAG == false && LAZY_FLAG == false)
{
DetectTimeAndProcess(UptimeBeginsAtHour, UptimeEndsAtHour);
}
/***
* DetectTimeAndProcess(startAtHour, stopAtHour):
* Starts or stops BizFlow Services based on uptime variables.
*
* ---Arguments---
* startAtHour Hour after which services should be started (defined by variable in main code)
* stopAtHour Hour after which services should be started (defined by variable in main code)
*
* ---Returns---
* None (void)
*
* ---Called By---
* Main code.
*/
function DetectTimeAndProcess(startAtHour, stopAtHour)
{
var currentTime = new Date();
var hour = currentTime.getHours(); // Returns Hour in 24-hour format
if (hour > startAtHour && hour < stopAtHour)
{
StartBizFlowServices();
}
else
{
StopBizFlowServices();
}
}
/***
* StartBizFlowServices():
* Starts BizFlow Services using "net start" and the service name.
*
* --- Arguments ---
* None.
*
* --- Returns ---
* None (void)
*
* --- Called By---
* DetectTimeAndProcess()
*/
function StartBizFlowServices()
{
var objShell = WScript.CreateObject("WScript.Shell");
objShell.Run("net start \"BizFlow Database Service\" ", 1, true);
objShell.Run("net start \"BizFlow Main Service\"", 1, true);
objShell.Run("net start \"BizFlow OLE-DB Service\"", 1, true);
objShell.Run("net start \"BizFlow PKI Service\"", 1, true);
objShell.Run("net start \"BizFlow Queue Service\"", 1, true);
objShell.Run("net start \"BizFlow Scheduler Service\"", 1, true);
}
/***
* StopBizFlowServices():
* Stops BizFlow Services using "net stop" and the service name.
*
* --- Arguments ---
* None.
*
* --- Returns ---
* None (void)
*
* --- Called By---
* DetectTimeAndProcess()
*/
function StopBizFlowServices()
{
var objShell = WScript.CreateObject("WScript.Shell");
objShell.Run("net stop \"BizFlow OLE-DB Service\"", 1, true);
objShell.Run("net stop \"BizFlow PKI Service\"", 1, true);
objShell.Run("net stop \"BizFlow Queue Service\"", 1, true);
objShell.Run("net stop \"BizFlow Scheduler Service\"", 1, true);
objShell.Run("net stop \"BizFlow Main Service\"", 1, true);
objShell.Run("net stop \"BizFlow Database Service\"", 1, true);
}
/***
*
* FindFile (filePath):
* Searches for the existence of a given file path.
*
* --- Arguments ---
* filePath Full Path of file (including file name)
*
* --- Returns ---
* true if file is found
* false if file is not found
*
* --- Called By---
* Main Code (while setting flags)
*/
function FindFile(filePath)
{
var fso; //For FileSystemObject
fso = new ActiveXObject("Scripting.FileSystemObject");
if(fso.FileExists(filePath))
{
return true;
}
else
{
return false;
}
}
私は実際にこれを少し誇りに思っています - それは初めてエラーなしで実行されました:)
いくつかのメモ:
- 時間は24時間形式で与えられます。
- 小切手が頻繁に実行されることを確認するために、5〜10分ごとに実行されるスケジュールされたタスクを設定します。
- ここで使用するサービスは、クライアントが使用している製品であるBizFlow Servicesです。もちろん、関数の名前をそれに応じて変更できます。
- サービス名の「ネットスタート」または「ネットストップ」を実行するときに引用符のエスケープ文字に注意してください。
- services.mscに表示されるように、フルサービス名を使用します。
コードをどのように改善するかについて質問やコメントがある場合はお知らせください!
ありがとう、
- ショーン
他のヒント
あなたはそれを言った:
...(.jsを直接指すことは機能しません、私は発見しました)
Windows 2003のタスクスケジューラからWSH JSファイルを実行しようとすると、それは私が遭遇したものでした。Win7では、.JSファイルへの参照だけで直接実行できましたが、渡されませんでした2003年のスケジューラで同じ方法で実行された場合、少なくともスクリプトのパラメーター。
私はあなたが言及したスタブバッチファイルの必要性を避けるために機能するように思われる回避策を見つけました:.jsファイルに「wscript」(または 'cscript')で.jsファイルをプレフィックスするだけの場合 - それらは必要なので、それらは必要ありません。 %windir% system32では、.jsファイルがパラメーターを渡すことを含めて、私にとっては機能しているようです。