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

2024-01-14

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

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

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

一些问题:

  • 这行得通吗?

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

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


如果有一种方法可以通过脚本查询 IIS 7 中的网站,而无需求助于 IIS 6 兼容包,无需使用 .NET (Microsoft.Web.管理.ServerManager http://msdn.microsoft.com/en-us/library/microsoft.web.administration.servermanager%28VS.90%29.aspx),并且不执行进程(appcmd 列出站点 http://learn.iis.net/page.aspx/114/getting-started-with-appcmdexe)。 我已经问过了关于该主题的一个单独的问题 https://stackoverflow.com/questions/5370288;对此有任何建议也将不胜感激。


回答我自己的问题...

  1. 是的,这会起作用。

  2. Use the 脚本.FileSystemObject http://msdn.microsoft.com/en-us/library/6kxy1a51%28v=VS.85%29.aspxJavaScript 中的东西。有一个GetTempName() http://msdn.microsoft.com/en-us/library/w0azsy9b%28v=VS.85%29.aspx产生适合临时使用的文件名的方法,以及GetSpecialFolder() http://msdn.microsoft.com/en-us/library/a72y2t1c%28v=VS.85%29.aspx获取临时文件夹位置的方法。甚至还有一个BuildPath() http://msdn.microsoft.com/en-us/library/z0z2z1zt%28v=VS.85%29.aspx方法将它们结合起来。

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

这是我使用的代码:

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WIX:我的 CustomAction 应在何处以及如何创建和读取临时文件? 的相关文章

随机推荐