После построения выполнить в PowerShell


можно ли настроить проект .net с событием post build для выполнения сценария powershell? Я использую этот скрипт для создания некоторых файлов. Также я могу передать, является ли это отладкой или выпуском сборки скрипта. Пример этого был бы замечательным.

6 68

6 ответов:

вот пример :

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

Set-ExecutionPolicy RemoteSigned

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

после того, как здесь вы можете перейти в свой проект свойства и настроить post build, как показано здесь под (извините на французском языке):

Post build in VS 2010

например :

Example of postbuild with 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

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

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

перед вызовом сценария power-shell из visual studio установите для ExecutionPolicy значение unrestricted from power-shell window следующим образом...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: unrestricted;

затем вызовите сценарий power-shell следующим образом...

(не нужно проходить полный " 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");

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

Я сделал это с помощью команды ниже в команде post-build even:

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)