Событие post build execute powershell

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

Ответ 1

Вот пример:

Прежде всего: вы должны знать о том, что 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" в целевом пути с именем конфигурации внутри. Я добавил несколько комментариев для отладки вашего postbuild script (окно сообщения, звук, сообщение на выходе)

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

Ответ 3

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

Содержимое 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 Pre-Build Step или аналогичном.

Ответ 4

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

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

Ответ 5

Перед вызовом power-shell script из visual studio установите ExecutionPolicy неограниченно из окна командной оболочки, как это...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: unrestricted;

оболочка вызова script следующим образом...

(не нужно передавать полный путь "powershell.exe" )

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

введите описание изображения здесь

то в script вы всегда можете прочитать параметр, подобный этому...

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