ビルド後のイベントはPowerShellを実行します


85

PowerShellスクリプトを実行するビルド後のイベントを使用して.NETプロジェクトをセットアップすることは可能ですか?このスクリプトを使用していくつかのファイルを生成しています。

また、デバッグビルドかリリースビルドかをスクリプトに渡すことはできますか。この例は素晴らしいでしょう。


回答:


118

ここに例があります:

まず第一に、スクリプトを実行するようにPowerShellを構成する必要があるという事実に注意する必要があります。次の行では、PowerShellでスクリプトを実行できます。

Set-ExecutionPolicy RemoteSigned

ここでの特記事項64ビットシステムを実行している場合は、'devenv.exe ' Visual Studio 2010実行可能ファイルが32ビットexeであることに注意する必要があるため、PowerShell32でスクリプトを実行できるようにする必要があります。

ここで、プロジェクトのプロパティに移動し、以下に示すようにビルド後を構成できます(フランス語で申し訳ありません):

VS2010でのビルド後

例えば ​​:

PowerShellを使用したポストビルドの例

これがファイル ' psbuild.ps1'test.txtで、ターゲットパスに構成名を含む ' 'を作成します。ビルド後のスクリプトをデバッグするためのさまざまな方法(メッセージボックス、サウンド、出力のメッセージ)をコメントに入れました

param ([string]$config, [string]$target)

#[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#[void][System.Windows.Forms.MessageBox]::Show("It works.")
#[Console]::Beep(600, 800)
#Write-Host 'coucou'
set-content $target -Value $config -Force

8
いい答えだ。実行ポリシーを無制限に設定するのではなく、代わりにremotesignedに設定する必要があることを付け加えておきます。Unrestrictedを使用すると、任意のスクリプトを実行できますが、remotesignedでは、ダウンロードしたスクリプトを信頼できるキーで署名する必要があります。
beefarino 2011年

2
ふむ、Fat32ドライブに.PS1ファイルをダウンロードすることをテストしますか、それとも基本的なコマンドラインFTPを使用して「remotesigned」で.PS1ファイルをダウンロードしますか?それは一種の「煙のようなセキュリティ」ではありませんか?
JPBlanc 2011年

3
64ビットシステムの特別な言及のための+ 1-私は32ビットPowerShellでの実行も許可する必要があると読むまで、私は怒っていました。ありがとう!
–guðmundurH 2012

残念ながら、画像ファイルはありません: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna

7
パスにc:\ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exeを使用すると、64ビットバージョンのPowerShellが呼び出されます。%systemroot%\ sysnativeは、リダイレクタにリダイレクトを停止し、%systemroot%\ system32への実際のアクセスを許可するように指示する特別なエイリアスです。
Peter Oehlert 2014

15

コマンドSet-ExecutePolicyは、現在のセッションで実行ポリシーを一時的に設定します。これをPowerShellで設定し、vsでビルド後のコマンドを実行しても、許可されません。したがって、最初に設定してから、次のようにps1スクリプトを実行します

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)

11

システム全体の設定をいじって32ビット環境と64ビット環境を区別する代わりに、PowerShellの呼び出しで次のように指定する方がはるかに簡単で信頼性の高い方法ですExecutionPolicy

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted

PS C:\Users\xyz> Get-ExecutionPolicy
Unrestricted

PS C:\Users\xyz> exit

C:\Users\xyz>PowerShell -ExecutionPolicy RemoteSigned

PS C:\Users\xyz> Get-ExecutionPolicy
RemoteSigned

上記のコードで、呼び出しGet-ExecutionPolicyによって現在のモードがどのように示されるかに注意してください。また、PowerShell自体の呼び出しでこのモードがどのように指定されているかにも注意してください。これは、スクリプトファイル名と組み合わせることができます。

test.ps1の内容:

echo ('The current policy is ' + (Get-ExecutionPolicy)).ToString()

Unrestrictedスクリプトが無効になっているシステムでポリシーを使用してtest.ps1を呼び出す:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted -file test.ps1
The current policy is Unrestricted

また、上記の呼び出しには管理者権限必要ないため、VisualStudioのビルド前の手順などで呼び出すことができます。


9

Visual StudioからPowerShellスクリプトを呼び出す前に、ExecutionPolicyを次のRemoteSignedようにPowerShellウィンドウから設定します...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

次に、次の方法でPowerShellスクリプトを呼び出します。

(完全な「powershell.exe」ファイルパスを渡す必要はありません)

powershell.exe $(SolutionDir)Setup.ps1 -SolutionDir $(SolutionDir) -ProjectPath $(ProjectPath)

ここに画像の説明を入力してください

次に、スクリプトでは、いつでも次のようなパラメータを読み取ることができます...

param([string]$SolutionDir,
     [string]$ProjectPath);
#Write-Host ($SolutionDir +" Call this script with following aruments");
#Write-Host ($ProjectPath +" Call this script with following aruments");

6

ビルド後のコマンドで以下のコマンドを使用して作成しました。

PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(SolutionDir)AutomationScript\DBAutomationScript.ps1 -target $(SolutionDir)MUFG.SECMOD.Data\SqlScripts -generatedFileName $(SolutionDir)MUFG.SECMOD.Data\SqlScripts\DeploymentDBScript.sql

DBAutomationScript.ps1の内容:

param ([string]$target, [string]$generatedFileName)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.