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