Чи можна створити проект .NET із подією після збірки для виконання сценарію PowerShell? Я використовую цей скрипт для створення деяких файлів.
Також я можу передати скрипту, чи це налагодження, чи збірка випуску. Прикладом цього було б чудово.
Чи можна створити проект .NET із подією після збірки для виконання сценарію PowerShell? Я використовую цей скрипт для створення деяких файлів.
Також я можу передати скрипту, чи це налагодження, чи збірка випуску. Прикладом цього було б чудово.
Відповіді:
Ось приклад:
Перш за все : ви повинні знати той факт, що PowerShell має бути налаштований для виконання сценаріїв. Наступний рядок дозволяє PowerShell виконувати сценарії:
Set-ExecutionPolicy RemoteSigned
Особлива згадка тут : якщо ви використовуєте 64-бітну систему, ви повинні подбати про те, що виконуваний файл Visual Studio 2010 'devenv.exe ' є 32-бітовим exe, тому вам потрібно дозволити PowerShell 32 виконувати сценарії.
Опинившись тут, ви можете зайти у властивості проекту та налаштувати збірку повідомлень, як показано тут у (вибачте французькою мовою):
Наприклад :
Ось файл ' 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
команда Set-ExecutePolicy тимчасово встановить політику виконання під час поточного сеансу. Якщо ви встановите це в PowerShell і запустите команду post build в vs, ви все одно отримаєте заборону. Отже, встановіть спочатку, а потім запустіть скрипт ps1, як показано нижче
powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)
Замість того, щоб возитись із загальносистемними налаштуваннями та розрізняти 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 або подібному.
Перш ніж викликати скрипт 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");
Я зробив це за допомогою команди нижче в команді 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)