セットアッププロジェクトでは、「。exe、.dll、.js、.vbs」などの実行可能ファイルは許容されますが、カスタムアクションで.bat
ファイルを実行する方法はありません。
問題は、インストール中に*.bat
ファイルを実行する方法です。
まあ、多くの検索と試行錯誤の後で、私はこれを解決しました。これが最善の方法かどうかはわかりませんが、うまくいきます。
これがシナリオです:Visual Studioセットアッププロジェクトを介してデプロイしたいアプリケーションがあります。アプリケーションファイルに加えて、バッチ(.bat)ファイルを含むサブディレクトリをターゲットディレクトリに作成したいと考えています。このファイルをインストールプロセスの最後に実行します。
ここではあなたが何をすべきかです:
/c "[TARGETDIR]subdirectoryname\batchfile.bat"
Argumentsプロパティで、subdirectorynameをサブディレクトリの名前で置き換える必要があります(私が行ったようにバッチファイルをサブディレクトリに置いた場合...そうしなかった場合、値は/c "[TARGETDIR]batchfile.bat"
)とbatchfile.batは、バッチファイルのファイル名にする必要があります。それでおしまい。残りのインストールプロセスが完了すると、バッチファイルが実行されます。
わかりやすくするための例を次に示します。
私のバッチファイル:blah.bat
私のサブディレクトリ:mydir
この場合、cmd.exeをターゲットとするカスタムアクションの引数の値は次のようになります。
/c "[TARGETDIR]mydir\blah.bat"
それが誰かを助けることを願っています!
同じ結果を得るもう1つの方法は、対応する.batファイルを実行するカスタムアクションに.vbsファイルを配置することです。次のコードは、セットアップアプリケーションフォルダーに配置した「RunRegisterComponents.vbs」です。もちろん、[TARGETDIR]をVisual Studioプロパティウィンドウの.vbsパラメータとして配置しました。
dim WshShell
Set WshShell = CreateObject("WScript.Shell")
' Read the "CustomActionData" property holding the install directory.
dim programDir
programDir= property("CustomActionData")
' Make the batch full file name and parameter
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) &
programDir& chr(34)
' Set the current directory
WshShell.CurrentDirectory = programDir
' Run batch.
ret = WshShell.Run (commandString, 0, 0)
それは私が私のカスタムアクションを設定したときです:
これがお役に立てば幸いです。
この記事をチェックしてください(記事は非推奨です)。VB.NETに含まれていますが、C#にも適用されます。最も重要な部分は、(C#に変換された)新しいクラスライブラリを作成し、次の内容で新しいインストーラークラスを追加することです。
override void Commit(IDictionary savedState)
{
base.Commit(savedState);
System.Diagnostics.Process.Start("myApp.bat","your bat arguments");
}
次に、インストーラープロジェクトにバッチファイルを追加します。バッチプロジェクトを配置するサブディレクトリを含め、通常どおりにセットアッププロジェクトを作成して構成します(サブディレクトリにしたくない場合は、直接アプリケーションフォルダーに配置できます)。
[ファイルシステム]ビュー(ソリューションエクスプローラー->表示->ファイルシステムでプロジェクトを右クリック)で、実行するバッチファイルを追加します。
インストーラープロジェクトをビルドします。
インストールプロセス中に相対パスを持つバッチファイルを実行しようとすると、確実に失敗します。これは、バッチファイルでは、インストーラーが実行されているディレクトリが考慮され、ファイルがインストールされているディレクトリは考慮されないためです。バッチファイルを一時ディレクトリにコピーするインストーラビルダーを使用します。