batファイルを使用してアプリケーションを展開する

労働の過程で、私は1つのタスクに直面しなければなりませんでした。 Windowsで実行され、カーネル、プロトコル、ブリッジ、配信チャネルなどのいくつかのコンポーネントで構成される特定の製品があります。 コンポーネントの一部はJAVAで、一部はC ++で記述されています。 配信チャネルは1〜20です。 各コンポーネントは独自のデータベースを使用します(MS SQL ServerはDBMSとして機能します)。 JAVAで記述されたコンポーネントの場合、データベース構造は自動的に作成され、C ++で記述されたコンポーネントの場合、構造はSQLスクリプトを使用して手動で作成する必要があります。 各コンポーネントは、システム内のサービスとして機能する必要があります。 これらはすべて徹底的にテストする必要があります。 テストごとに、データベースとシステムサービスを再作成する必要があります。

このことを一度行った後、このプロセスを可能な限り自動化する方法を考えました(アクションは複雑ではなく、日常的です)。 ソリューションはシンプルで、ソフトウェアをインストールする必要はありません。 したがって、すぐに選択は、組み込みのコマンド言語である古くから実績のあるスクリプトファイル-Bat。 同時に、batスクリプトがまだ可能なものを確認します。

スクリプトを使用してすべてのアクションを記録しようとします。 これを行うには、ログファイル名を設定します。
@ LOGFILE = "log。%DATE%_%TIME:〜0.2%-%TIME:〜3.2%-%TIME:〜6.2%.txt"

次のような出力ファイルが得られます:log.14.02.2012_10-41-42.txt
ただし、朝または夜遅くに仕事が好きな人は、次のようになります:log.14.02.2012_ 1-03-28.txt
これを修正する方法についての提案を喜んで検討します。

UPD。 よりエレガントなソリューションを提供してくれたみんな、特にDJnKユーザーに感謝します。
for / f "tokens = 1-4 delims =:" %% a in 'echo%time:〜0.8%' do set mytime = %% a_ %% b_ %% c


バッチファイルでアクションの選択を設定します。これは最初のパラメーターとして渡されます
@ rem INSTALLまたはREMOVE
ACTION = 1を設定


データベースに接続する行を設定します。
@ rem形式: < ComputerName > < InstanceName >または単なるIP
@ rem -Uオプションも-Pオプションも指定されていない場合、sqlcmdはMicrosoft Windows認証モードを使用して接続を試みます。
@ remこれは、sqlcmdプログラムを起動したWindowsユーザーアカウントを使用します。
url_db = "(local)"を設定します


次に、各コンポーネントに特定のパラメーターを設定します。 コンポーネントを使用する必要があるかどうか(yまたはn)は、パラメーターから設定します
@ remこれらのパラメーターを入力します、y-カーネルのグローバルデータベースを作成する場合
@ set WorkWhisKernel = 2
@ KernelDbName =カーネルの設定
@ set KernelUserName = Kernel
@ set KernelUserPassw =カーネル
@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル
@ set KernelRecovery_mode = SIMPLE

@ remこれらのパラメーターを入力します、y-チャネルのデータベースを作成する場合
@ set WorkWhisChannel = 3
@ ChannelDbName =チャネルの設定
@ ChannelDbCount = 10を 設定
@ set ChannelUserName = Channel
@ set ChannelUserPassw =チャンネル
@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル
@ ChannelRecovery_mode = SIMPLEを設定
@ rem 「_」記号を使用して、データベース名とその番号を区切ります。 たとえば、test_1またはtest1
@ Use_underline = yを設定
@ remチャネルのデータベースバージョン
@ set ChannelVersion = mssql.Channel_5.4.3.2

@ remこれらのパラメーターを入力します、y-Bridgeのデータベースを作成する場合
@ set WorkWhisBridge = 4
@ set BridgeDbName = Bridge
@ set BridgeUserName = Bridge
@ set BridgeUserPassw =ブリッジ
@ remベースの復旧モデル。 利用可能な完全な値| BULK_LOGGED | シンプル
@ BridgeRecovery_mode = SIMPLEを設定
@ rem Bridgeのデータベースバージョン
@ set BridgeVersion = mssql.Bridge_1.1.3


さらに、ベースでのアクションのタイプ(INSTALLまたはREMOVE)、およびこのコンポーネントを使用するかどうかに応じて、特定のアクションを実行します。
便宜上、データベースに対するアクションは個別のSQLスクリプトで作成されます。 sqlcmdユーティリティを使用して作業します。 MSSQL Serverがマシンにインストールされていない場合は、sqlcmdをダウンロードして、 SQL Server Express Utility配布の一部として使用できます

if "%WorkWhisI_k%" == "y"
if "%ACTION%" == "INSTALL"
@ remカーネルお​​よびユーザーと彼女のグローバルデータベースを作成します
sqlcmd -S url_db -i Kernel.sql >> LOGFILE

if "%ACTION%" == "REMOVE"
@ rem informer_kernelデータベースとそのユーザーを削除します
sqlcmd -S url_db -i KernelDel.sql >> LOGFILE



ご覧のとおり、ここではすべてが非常に簡単です。 ただし、データベース、ユーザーなどの名前を転送する方法など、小さな問題があります。 sqlcmd経由で呼び出されたSQLスクリプトで?
実際、すべてが非常に簡単です。
-データベースのログインを作成する
CREATE LOGIN $ KernelUserName
WITH PASSWORD = '$(KernelUserPassw)' CHECK_POLICY = OFF;
行く

-データベースを作成する
使用マスター;
CREATE DATABASE $ KernelDbName ;
行く

-データベース回復モードを設定する
ALTER DATABASE $ KernelDbName SET RECOVERY $ KernelRecovery_mode
行く

-データベースのユーザーを作成する
USE $ KernelDbName ;
ログイン$ KernelUserName )のユーザー$ KernelUserName )の作成
WITH DEFAULT_SCHEMA = dbo;
行く

-ユーザーに役割を割り当てる
USE $ KernelDbName ;
EXEC sp_addrolemember 'db_owner' '$(KernelUserName)'
行く


同様の行は、Bridgeコンポーネント用です。 しかし、チャンネルコンポーネントについては、たとえば10個になります。 したがって、単純なループを追加します。
for / L %% i in 1、1 ChannelDbCount do
if "%Use_underline%" == "y"
@ ChannelDbNameCounter = ChannelDbName _ %% iを設定
else
@ set ChannelDbNameCounter = ChannelDbName %%% i

ChannelDbNameCounter
@ remデータベースcp_serviceを作成します
sqlcmd -S url_db -i Channel.sql >> LOGFILE
@ rem cp_serviceのデータベース構造を作成します
sqlcmd -S url_db -i ChannelVersion .sql >> LOGFILE


次に、システムにコンポーネントのサービスをインストールします(チャンネルコンポーネントのみの例を示します)。
@ remチャネル数
SET ChannelDbCount = 10
@ remスタートアップの種類<ブート| システム| 自動| 需要| 無効| エラー>
SET run_type = demand
@ rem Service Dependencies / スラッシュ)で区切られている
SET depend = MSSQLSERVER

for / L %% i in 1、1 ChannelDbCount do
@ remは、チャンネルサービスをインストールします。 コンポーネントをサービスとしてインストールするには、その内部実装が使用されます。
ルビーチャンネル%% i.exe --install
サービスの@ remは、 1分の間隔で3回再起動を設定します。 致命的なエラーが発生した場合
sc failure Channel %% i reset = 240 actions = restart / 60000 / restart / 60000 / restart / 600000
@ remサービスの開始タイプ<ブート| システム| 自動| 需要| 無効| エラー>および依存関係<依存関係 / スラッシュ)で区切られる >
sc config Channel %% i start = run_type depend = depend


インストールされたサービスを起動します。
for / L %% i in 1、1 ChannelDbCount do
sc startチャンネル%% i


サービスを停止および削除するためのコードは提供しません。 彼は同一です。

ここで、前に書いたすべてを作成します。
install.bat yyyパラメーターを使用した製品デプロイメントスクリプトの実行

@ remデータベースを作成するためのパラメーターを使用してメインスクリプトを実行します
DbManage.bat INSTALL 1 2 3

@ remインストールサービス
InstallServices.bat

@ remすべてのサービスを起動します
StartServices.bat


install.bat yyyパラメーターを使用した製品アンインストールスクリプトの実行
@ remサービスが開始されると停止します
StopServices.bat

@ remすべてのサービスを停止する時間があるように溝を作ります
@ rem Dataメソッドは、サーバー以外のWindowsでは機能しない場合があります
タイムアウト/ t 10

@ rem古いサービスを削除
RemoveServices.bat

@ rem削除用のパラメーターを使用してメインスクリプトを実行します
DbManage.bat REMOVE 1 2 3を開始します


その結果、最小限の労力でこの操作の最初に書かれたすべての目的のアクション、つまりいくつかのパラメーターを含む通常のバッチファイルを起動することができました。
もちろん、実装は完全ではありませんが、機能を実行します。 古き良き「バッチファイル」はまだ何かを実行できますが、今度はPoverShellに切り替えます。 ただし、特に証明書と署名スクリプトにはいくつかの困難があります。

一般的に、彼らが言うように、理想的な解決策は存在しません。

Source: https://habr.com/ru/post/J138162/


All Articles