使用带有 Web 平台安装程序 API 的 Powershell 仅在 64 位机器上获取 x86 安装程序

Posted

技术标签:

【中文标题】使用带有 Web 平台安装程序 API 的 Powershell 仅在 64 位机器上获取 x86 安装程序【英文标题】:Using Powershell W/ Web Platform Installer API Only Fetches x86 Installers on 64 bit Machine 【发布时间】:2015-06-25 21:09:42 【问题描述】:

我正在尝试编写一个脚本来自动在带有 IIS 8 和 Web 平台安装程序 5 的 x64 Windows Server 2012 R2 上安装应用程序请求路由包。我已经复制了我在下面使用的代码:

Try 
[reflection.assembly]::LoadWithPartialName("Microsoft.Web.PlatformInstaller") | Out-Null
$ProductManager = New-Object Microsoft.Web.PlatformInstaller.ProductManager
$ProductManager.Load()

$product = $ProductManager.Products | Where  $_.ProductId -eq "ARRv3_0" 


#Get an instance of InstallManager class to perform package install
$InstallManager = New-Object Microsoft.Web.PlatformInstaller.InstallManager

$installer = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Installer]'

$Language = $ProductManager.GetLanguage("en")

#Get dependencies
$deplist = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Product]'
$deplist.add($product)
$deps = $product.getMissingDependencies($deplist)
foreach ($dep in $deps)  

        Write-Host "$($dep.GetInstaller($Language))"

        $Installer.Add($dep.GetInstaller($Language))
        Write-Host "Dependency $($dep.Title) not found..."


$installer.Add($product.Installers[1])
$InstallManager.Load($installer)

#Download the installer package
$failureReason=$null
foreach ($installerContext in $InstallManager.InstallerContexts) 
    $InstallManager.DownloadInstallerFile($installerContext, [ref]$failureReason)

    Write-Host $($installerContext)


$InstallManager.StartSynchronousInstallation()

notepad $product.Installers[1].LogFiles

Write-Host "Opening logs at $($product.Installers[1].LogFiles)"
Write-Host "Installation finished"


Catch 
    Write-Error "FATAL ERROR! $($_)"


Finally 
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
 

ARRv3_0 有两个依赖,ExternalCache 和 UrlRewrite2。

但是,当我尝试使用以下方式拉动安装程序时:

$Language = $ProductManager.GetLanguage("en")
$installer.Add($dep.GetInstaller($Language))

(其中 $dep 是对产品的引用)它只获取 x86 版本,不会安装在 64 位机器上。我查看了 ProductList Xml,其中包含 Web 平台包 here 的列表,并且我已经复制并粘贴到存在的 UrlRewrite2 包的 x64 变体下面。

<installer>
    <id>20</id>
    <languageId>en</languageId>
    <architectures>
        <x64/>
    </architectures>
    <eulaURL>
    ......
</installer>

有趣的是,有一个架构参数,但查看Microsoft.Web.PlatformInstaller API 似乎没有设置/访问它的方法。除了硬编码,还有什么方法可以告诉 API 获取 64 位版本吗?

我肯定会在 64 位机器上的 64 位 powershell 中运行它,但 api 会获取 x86 安装程序似乎非常违反直觉。是否有一些我遗漏的非常明显(且记录不充分)的设置?

【问题讨论】:

你有没有设法解决这个问题? 【参考方案1】:

Product 类作为 Installers 属性。我没有获得默认安装程序,而是获得了一个特定的安装程序(64 位)并将其添加到作为参数传递给 InstallManager 的安装程序的通用列表中。这是sn-p。

$installers = New-Object 'System.Collections.Generic.List[Microsoft.Web.PlatformInstaller.Installer]'

foreach($i in $product.Installers)
        
        if($i.InstallerFile.InstallerUrl.ToString().ToLower().EndsWith("_amd64.msi"))
                    
            $i.InstallerFile
            $installers.Add($i)
            break
        
  

【讨论】:

通过 amd64 过滤安装程序适用于产品安装程序,但列出的依赖项仅是 x86 安装。就像依赖关系列表是建立在产品的第一个安装程序 (x86) 之上的。我尝试了 GetInstaller 来考虑可能是系统感知的产品/依赖关系,但它也不是。我想弄清楚正确的依赖关系,而不是必须手动找出并将它们作为根产品包含在内。

以上是关于使用带有 Web 平台安装程序 API 的 Powershell 仅在 64 位机器上获取 x86 安装程序的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个通知平台同时支持带有 Xamarin 的移动应用程序和带有 Javascript 的 Web 浏览器

带有实体框架的 CRUD WEB API

WEB通用抽奖程序设计 开放的API接口

如何调用带有认证服务的webapi

Laravel 4 使用令牌进行身份验证

带有asp.net Web API后端的Angular 2 Web应用程序的实时通知[关闭]