Можно ли настроить проект .NET с событием после сборки для выполнения сценария PowerShell? Я использую этот сценарий для создания некоторых файлов.
Также могу я передать скрипту отладочную или выпускную сборку. Пример этого был бы замечательным.
Можно ли настроить проект .NET с событием после сборки для выполнения сценария PowerShell? Я использую этот сценарий для создания некоторых файлов.
Также могу я передать скрипту отладочную или выпускную сборку. Пример этого был бы замечательным.
Ответы:
Вот пример:
Прежде всего : вы должны знать, что PowerShell необходимо настроить для выполнения скриптов. Следующая строка позволяет PowerShell выполнять сценарии:
Set-ExecutionPolicy RemoteSigned
Особое упоминание здесь : если вы используете 64-битную систему, вы должны позаботиться о том, чтобы 'devenv.exe » The Visual Studio 2010 представляет собой исполняемый файл 32бит ех, так что вам нужно , чтобы 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");
Я сделал это с помощью следующей команды в команде даже после сборки:
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)