Событие после сборки выполнить PowerShell


86

Можно ли настроить проект .NET с событием после сборки для выполнения сценария PowerShell? Я использую этот сценарий для создания некоторых файлов.

Также могу я передать скрипту отладочную или выпускную сборку. Пример этого был бы замечательным.


Ответы:


120

Вот пример:

Прежде всего : вы должны знать, что PowerShell необходимо настроить для выполнения скриптов. Следующая строка позволяет PowerShell выполнять сценарии:

Set-ExecutionPolicy RemoteSigned

Особое упоминание здесь : если вы используете 64-битную систему, вы должны позаботиться о том, чтобы 'devenv.exe » The Visual Studio 2010 представляет собой исполняемый файл 32бит ех, так что вам нужно , чтобы PowerShell 32 для выполнения сценариев.

Оказавшись здесь, вы можете войти в свойства своего проекта и настроить пост-сборку, как показано здесь (извините по-французски):

Пост-сборка в VS 2010

Например :

Пример постбилда с помощью powershell

Вот файл ' psbuild.ps1', он создает ' test.txt' в целевом пути с именем конфигурации внутри. Я прокомментировал разные способы отладки вашего postbuild-скрипта (окно сообщения, звук, сообщение на выходе)

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
Хороший ответ. Я бы только добавил, что вы не должны устанавливать политику выполнения как неограниченную, а вместо этого устанавливать удаленную подписку. Unrestricted позволяет выполнять любой скрипт, в то время как remotesigned требует, чтобы загруженные скрипты были подписаны доверенным ключом.
beefarino

2
Хм, вы тестируете, чтобы загрузить файл .PS1 на диск Fat32, или использовать базовую командную строку FTP для загрузки файла .PS1 с "удаленной подписью"? Разве это не «дымная охрана»?
JPBlanc

3
+1 за особое упоминание о 64-битных системах - я сходил с ума, пока не прочитал, что мне также нужно разрешить выполнение в 32-битной PowerShell. Благодаря!
Guðmundur H

к сожалению, файлов изображений нет: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Анджей Мартина

7
Если вы используете: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe в качестве пути, будет вызвана 64-разрядная версия powershell. % systemroot% \ sysnative - это специальный псевдоним, указывающий перенаправителю прекратить перенаправление и разрешить реальный доступ к% systemroot% \ system32.
Peter Oehlert 05

15

команда Set-ExecutePolicy временно устанавливает политику выполнения для текущего сеанса. Если вы установите это в PowerShell и запустите команду post build в vs, вы все равно не получите доступ. Поэтому сначала установите, а затем запустите свой скрипт ps1, как показано ниже

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

11

Вместо того, чтобы возиться с общесистемными настройками и различать 32- и 64-разрядные среды, гораздо более простой и надежный подход - указать ExecutionPolicyв вызове PowerShell следующим образом:

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()

Вызов test.ps1 с Unrestrictedполитикой в ​​системе с отключенными скриптами:

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

Также обратите внимание, что для вышеуказанного вызова не требуются права администратора, поэтому его можно вызвать на этапе предварительной сборки Visual Studio или аналогичном.


9

Перед вызовом сценария power-shell из Visual Studio установите ExecutionPolicy в RemoteSignedокно power-shell следующим образом ...

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.