Событие после сборки выполнить PowerShell - PullRequest
75 голосов
/ 28 июня 2011

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

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

Ответы [ 5 ]

110 голосов
/ 28 июня 2011

Вот пример:

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

Set-ExecutionPolicy RemoteSigned

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

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

Post build in VS 2010

Например:

Example of postbuild with 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
10 голосов
/ 13 марта 2017

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

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)
8 голосов
/ 19 января 2017

Перед вызовом сценария 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)

enter image description here

тогда в скрипте вы всегда можете прочитать параметр следующим образом ...

param([string]$SolutionDir,
     [string]$ProjectPath);
#Write-Host ($SolutionDir +" Call this script with following aruments");
#Write-Host ($ProjectPath +" Call this script with following aruments");
7 голосов
/ 21 мая 2016

Вместо того, чтобы возиться с общесистемными настройками и проводить различие между 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 или аналогичном.

5 голосов
/ 02 августа 2018

Я сделал это с помощью команды ниже в четной команде пост-сборки:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...