如何在chocolateyInstall.ps1的Chocolatey包中使用EXE?

时间:2016-03-22 11:10:17

标签: package install chocolatey

我正在构建一个独立的Chocolatey包。包文件夹包含:app.nuspecapp.exeapp.nupkgtools子文件夹。 chocolateyInstall.ps1是这样的:

$packageName = 'app'
$fileType = 'exe'
$silentArgs = '/VERYSILENT'
$url = '../app.exe' # the location of the file relative to the tools folder

Install-ChocolateyPackage $packageName $fileType $silentArgs $url

当我跑步时:

choco install app -y

我明白了:

Copy-Item : cannot find the path C:\ProgramData\app.exe because does not exist

我该如何使这项工作?我已经阅读过一些关于用垫片创建自包含的包装的信息。但我真的不知道如何使用它?有帮助吗?谢谢

编辑1

我在这里找到了另一个解决方案(http://patrickhuber.github.io/2015/03/19/creating-enterprise-versions-of-public-chocolatey-packages.html)。所以我的情况是:

$directory = $PSScriptRoot
$packageName = 'app'
$fileType = 'exe'
$silentArgs = '/VERYSILENT'
$url = Join-Path $directory '..\app.exe'     


Install-ChocolateyPackage $packageName $fileType $silentArgs $url 

我想知道$PSScriptRoot变量是什么?

2 个答案:

答案 0 :(得分:3)

对于包含exe / msi的Chocolatey包,您可以使用Install-ChocolateyInstallPackage辅助方法,而不是Install-ChocolateyPackage辅助方法。这在Chocolatey Wiki here

上有记载

这与其他辅助方法的工作方式非常相似,但不需要/需要下载exe / msi。它使用它提供的路径,并从那里安装。

您可以找到ChocolateyGUI package中所需内容的完整示例,它的功能非常相似。

它的症结如下所示:

$packageName = 'ChocolateyGUI'
$fileType = 'msi'
$silentArgs = '/quiet'
$scriptPath =  $(Split-Path $MyInvocation.MyCommand.Path)
$fileFullPath = Join-Path $scriptPath 'ChocolateyGUI.msi'

Install-ChocolateyInstallPackage $packageName $fileType $silentArgs $fileFullPath

答案 1 :(得分:2)

不知怎的,我们仍然缺少脚本和调用者相对路径的解释。在这种情况下,Chocolatey正在执行

%PROGRAMDATA%\Chocolatey\choco.exe

您的脚本告诉它上升一级并查找app.exe

%PROGRAMDATA%\app.exe

Gary的答案暗示,使用$MyInvocation是你需要构建相对于脚本位置而不是调用者位置的路径。您通过使用$PSScriptRoot加入路径找到了另一种方法。

这两个变量都称为"Automatic variables"

  

$ MyInvocation

     

包含有关当前命令的信息,例如名称,   参数,参数值以及有关命令如何的信息   启动,调用或调用,"例如调用的脚本的名称   当前命令。

     

仅为脚本,函数和脚本块填充$ MyInvocation。   您可以使用System.Management.Automation.InvocationInfo中的信息   $ MyInvocation在当前脚本中返回的对象,例如路径   和脚本的文件名($ MyInvocation.MyCommand.Path)或者名称   函数($ MyInvocation.MyCommand.Name)来标识当前命令。   这对于查找当前脚本的名称特别有用。

  

$ PSScriptRoot

     

包含运行脚本的目录。

     

在Windows PowerShell 2.0中,此变量仅在脚本模块中有效   (名为.psm1)。从Windows PowerShell 3.0开始,它在所有脚本中都有效。