Событие после сборки выполнить 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
JPBlanc
источник
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)
jnm
источник