1

プロパティに設定された値を回復する 1 つのテキスト ボックスを備えたカスタム UI を持つ Visual Studio インストーラーがありQUEUEDIRECTORYます。次に、この行でそのプロパティ値を渡すカスタム アクション (インストーラー クラス) があります/queuedir="[QUEUEDIRECTORY]"。インストーラーはうまく機能します。

ここで、コマンドライン経由でその値を送信して、組織全体のシステム管理者がこのインストーラーを実行できるようにする必要があります。そのため、次のコマンド ライン ステートメントを試しましたが、うまくいきません。

msiexec /i Setup.msi QUEUEDIRECTORY="D:\temp"
Setup.msi QUEUEDIRECTORY="D:\temp"
Setup.msi queuedir="D:\temp"
msiexec /i Setup.msi queuedir="D:\temp"

さらに、解決策を見つけることができなかったため、ハッキングされたように感じないものをオンラインで見つけることができないようです. つまり、MSIデータベースとすべてを編集しているいくつかのソリューションを見つけたということですが、特にVisual Studio 2010を使用しているため、それが正しいソリューションではないように思われる人は、このオファリングの最初のリリース。

これは機能するように見える記事の 1 つですが、実際にはハックのように感じます。

とにかく、あなたが私を助けてくれることを願っています!

4

3 に答える 3

2

これは、Visual Studio 2010 でコマンド ラインのみのプロパティ値を MSI に追加するために行ったことです。CommandLineSupport.js次のコードを使用して、セットアップ プロジェクト (.vdproj) ディレクトリに作成します。

//This script adds command-line support for MSI installer
var msiOpenDatabaseModeTransact = 1;

if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

WScript.Echo(WScript.Arguments(0));
var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view

try
{

    sql = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('MYPROPERTY', 'MYPROPERTY=\"\"')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

次に、Visual Studio で展開プロジェクトをクリックしてプロジェクトのプロパティを表示し、次のように設定PostBuildEventします。

cscript.exe "$(ProjectDir)CommandLineSupport.js" "$(BuiltOuputPath)"

次に、カスタム アクションを使用して Delopyment プロジェクトをセットアップします。Primary Output をクリックして Custom Action Properties に移動し、CustomActionDataフィールドを/MYPROPERTY="[MYPROPERTY]"

次に、次のようにカスタム アクション インストーラー クラスでそのプロパティにアクセスできます。

public override void Install(IDictionary stateSaver)
{
     base.Install(stateSaver);

     string the_commandline_property_value = Context.Parameters["MYPROPERTY"].ToString();
}

最後に、cmd を実行できます。 C:\>Setup.msi MYPROPERTY=VALUE

これには、Orca をいじったり、受け入れられた回答のようなカスタム ダイアログ コントロールを使用したりする必要はありません。正しい .msi 名を持つように PostBuildEvent を変更する必要もありません。など。次のように、必要な数のプロパティを追加することもできます。

INSERT INTO `Property` (`Property`, `Value`) VALUES ('MYPROPERTY', 'MYPROPERTY=\"\"'),('MYPROPERTY2', 'MYPROPERTY2=\"\"', ('MYPROPERTY3', 'MYPROPERTY3=\"\"')) ";

楽しむ!

于 2014-10-07T18:39:44.913 に答える
0

わかりましたので、質問でリンクしたソリューションを使用することになりました。しかし、完全を期すためにここにスクリプトを置いておきます。最初に行う必要があったのは、次のコードを含む JS ファイルを作成し (私は という名前を付けましたCommandLineSupport.js)、それ.vdproj.

//This script adds command-line support for MSI build with Visual Studio 2008. 
var msiOpenDatabaseModeTransact = 1;

if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " file");
    WScript.Quit(1);
}

WScript.Echo(WScript.Arguments(0));
var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view

try
{
    //Update InstallUISequence to support command-line parameters in interactive mode.
    sql = "UPDATE InstallUISequence SET Condition = 'QUEUEDIRECTORY=\"\"' WHERE Action = 'CustomTextA_SetProperty_EDIT1'";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    //Update InstallExecuteSequence to support command line in passive or quiet mode.
    sql = "UPDATE InstallExecuteSequence SET Condition = 'QUEUEDIRECTORY=\"\"' WHERE Action = 'CustomTextA_SetProperty_EDIT1'";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

Actionもちろん、Orca で MSI を開き、Property作成したカスタム ダイアログと一致させることで、権利を置き換える必要があります。

次に、JS ファイルが機能するようになったので、に を追加する必要がありPostBuildEventました.vdproj。これを行うには、Visual Studio でセットアップ プロジェクトをクリックして を押しますF4。次に、PostBuildEventプロパティを見つけて、省略記号をクリックします。そのPostBuildEvent場所でこのコード:

cscript "$(ProjectDir)CommandLineSupport.js" "$(BuildOutputPath)Setup.msi"

必ずSetup.msiMSI ファイルの名前に置き換えてください。

私はまだそれがハックのように感じますが...それはそうなので...動作し、今のところ仕事をします. それは本当に大したことではないほど小さなプロジェクトです。

于 2012-10-24T17:45:41.113 に答える