Подія побудови події виконує PowerShell


85

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

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


Відповіді:


118

Ось приклад:

Перш за все : ви повинні знати той факт, що PowerShell має бути налаштований для виконання сценаріїв. Наступний рядок дозволяє PowerShell виконувати сценарії:

Set-ExecutionPolicy RemoteSigned

Особлива згадка тут : якщо ви використовуєте 64-бітну систему, ви повинні подбати про те, що виконуваний файл Visual Studio 2010 'devenv.exe ' є 32-бітовим exe, тому вам потрібно дозволити 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
Гарна відповідь. Я хотів би лише додати, що ви не повинні встановлювати політику виконання необмеженою, а замість неї віддаленою. Необмежений дозволяє виконувати будь-який сценарій, тоді як для віддаленого проектування потрібно, щоб завантажені сценарії підписували надійним ключем.
beefarino

2
Чи тестуєте ви для завантаження файлу .PS1 на привід Fat32 чи використовуєте базовий cmdline 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

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

Я зробив це за допомогою команди нижче в команді 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.