WIX:我的CustomAction应该在哪里以及如何创建和读取临时文件?

时间:2011-03-22 17:04:48

标签: javascript iis-7 wix windows-installer

我有一个脚本CustomAction(是的,我知道所有关于不使用脚本CustomActions 的意见。我有不同意见。)

我想运行命令,并捕获输出。我可以使用WScript.Shell COM对象执行此操作,然后调用shell.Exec()。但是,这会为执行的命令闪烁一个可见的控制台窗口。

为了避免这种情况,我知道我可以使用shell.Run()调用,并为窗口外观指定“隐藏”。但.Run()不允许我访问已执行进程的StdOut,这意味着我需要创建一个临时文件并将exe输出重定向到临时文件,然后在脚本中读取该临时文件。

有些问题:

  • 这会起作用吗?

  • 如何为临时文件生成名称?在.NET中我可以在System.IO命名空间中使用静态方法,但我在这里使用脚本。我需要确保使用RW访问权限,并且没有反病毒程序会对此产生误解。

  • 更好的想法?我正在努力避免使用C / C ++。


如果有一种方法可以从脚本中查询IIS7中的网站,而不使用IIS6兼容包,而不使用.NET(Microsoft.Web.Administration.ServerManager),并且不执行进程({{3 }})。 我已经问过appcmd list sites;对此的任何建议也将不胜感激。

1 个答案:

答案 0 :(得分:8)

回答我自己的问题......

  1. 是的,这可行。

  2. 在Javascript中使用Scripting.FileSystemObject内容。有一个GetTempName()方法可以生成一个适合临时使用的文件名,还有一个GetSpecialFolder()方法可以获取临时文件夹的位置。甚至还有BuildPath()方法来组合它们。

  3. 到目前为止,我没有更好的想法。

  4. 这是我使用的代码:

    function GetWebSites_IIS7_B()
    {
        var ParseOneLine = function(oneLine) {
            ...regex parsing of output...
        };
    
        LogMessage("GetWebSites_IIS7_B() ENTER");
    
        var shell = new ActiveXObject("WScript.Shell");
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder);
        var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName());
        var windir = fso.GetSpecialFolder(SpecialFolders.WindowsFolder);
        var appcmd = fso.BuildPath(windir,"system32\\inetsrv\\appcmd.exe") + " list sites";
    
        // use cmd.exe to redirect the output
        var rc = shell.Run("%comspec% /c " + appcmd + "> " + tmpFileName, WindowStyle.Hidden, true);
        // WindowStyle.Hidden == 0
        var ts = fso.OpenTextFile(tmpFileName, OpenMode.ForReading);
        var sites = [];
    
        // Read from the file and parse the results.
        while (!ts.AtEndOfStream) {
            var oneLine = ts.ReadLine();
            var line = ParseOneLine(oneLine);
            LogMessage("  site: " + line.name);
            sites.push(line);
        }
        ts.Close();
        fso.DeleteFile(tmpFileName);
    
        return sites;
    }