2016-03-22 11 views
2

私は自己完結型のChocolateyパッケージを構築しています。パッケージフォルダには、app.nuspec,app.exeapp.nupkg、およびtoolsというサブフォルダが含まれています。私は実行するとchocolateyInstall.ps1のChocolateyパッケージでEXEを使用するにはどうすればよいですか?

$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 

chocolateyInstall.ps1はこのようなものです

choco install app -y 

私が取得:

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

は、どのように私はこの作業を行うことができますか?私はシムで自己完結型パッケージを作ることについて少しは読んだことがありますが、実際にそれを使う方法は分かりません。どんな助け?私もここにこの他の解決策の作業を行います(http://patrickhuber.github.io/2015/03/19/creating-enterprise-versions-of-public-chocolatey-packages.html)を発見した1

EDITお願いします。だから、だろう私の場合:

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


Install-ChocolateyPackage $packageName $fileType $silentArgs $url 

私は$PSScriptRoot変数は何か不思議でしたか?

+0

相対パスでは機能しません。以下のゲイリーの答えを見てください。 'choco new pkgname'は、この権利を得るために必要なものすべてを生成することにも留意してください。 – ferventcoder

+1

'$ PSScriptRoot'は' $(Split-Path $ MyInvocation.MyCommand.Path) 'と同じですが、PowerShell v3 +で利用可能な自動変数です。以前の方法を使用することをお勧めします.3台以上のマシン(Windows 8/Windows 2012以降のマシン)を使用している場合、WMFを他のすべてのマシンでアップグレードしている場合は、問題なく '$ PSScriptRoot'を使用しても問題ありません。 – ferventcoder

答えて

3

exe/msiを含むChocolateyパッケージを実行する場合は、Install-ChocolateyPackageヘルパーメソッドではなく、Install-ChocolateyInstallPackageヘルパメソッドを使用できます。これは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

編集を確認してください。私は今あなたのコードを試してみるつもりです。 – diegus

2

はどういうわけか、私たちはまだscript-、コール元が相対パスの説明を逃しています。この場合、Chocolateyは

%PROGRAMDATA%\Chocolatey\choco.exe 

あなたのスクリプトから実行されているが、1つ上のレベルに行くとapp.exeを探すために、それを言っている、それはゲイリーの答えは$MyInvocationを使用することによって、意味は何

%PROGRAMDATA%\app.exe 

はあなたが必要だということですです呼び出し元の場所ではなく、スクリプトの場所を基準にしてこのパスを構築します。パスを$PSScriptRootに参加させることで、これを行う別の方法が見つかりました。

これらの変数の両方は、"Automatic variables"として知られています。

$ MyInvocation

は、名前など、 パラメータ、パラメータ値、およびコマンドが のような「呼び出された」、開始と呼ばれる、またはされた方法についての情報を現在のコマンドに関する情報が含まれています現在のコマンド を呼び出したスクリプトの名前。

$ MyInvocationは、スクリプト、関数、およびスクリプトブロックに対してのみ設定されます。 パス などの現在のスクリプトで$ MyInvocationが返すSystem.Management.Automation.InvocationInfoオブジェクトの情報を使用できます。このスクリプトのファイル名($ MyInvocation.MyCommand.Path)または 現在のコマンドを識別する関数($ MyInvocation.MyCommand.Name)。 これは、現在のスクリプトの名前を見つけるのに特に便利です。

そして

$ PSScriptRoot

は、スクリプトが実行されて、そこからディレクトリが含まれています。

Windows PowerShell 2.0では、この変数はスクリプトモジュール (.psm1)でのみ有効です。 Windows PowerShell 3.0以降、すべてのスクリプトで有効です。

+0

あなたの説明をありがとう。それは今私にとってもっと意味をなさない – diegus

関連する問題