É possível configurar um projeto .NET com um evento pós-compilação para executar um script do PowerShell? Estou usando este script para gerar alguns arquivos.
Também posso passar se é uma depuração ou versão de compilação para script. Um exemplo disso seria ótimo.
c#
.net
powershell
msbuild
amador
fonte
fonte
Respostas:
Aqui está um exemplo :
Em primeiro lugar : você deve estar ciente do fato de que o PowerShell deve ser configurado para executar scripts. A linha a seguir permite que o PowerShell execute scripts:
Set-ExecutionPolicy RemoteSigned
Menção especial aqui : se você estiver executando um sistema de 64 bits, você deve cuidar do fato de que 'devenv.exe ' o executável do Visual Studio 2010 é um exe de 32 bits, então você precisa permitir que o PowerShell 32 execute scripts.
Uma vez aqui, você pode ir nas propriedades do seu projeto e configurar a pós-construção como mostrado aqui em (desculpe em francês):
Por exemplo :
Aqui está o arquivo '
psbuild.ps1
', ele cria um 'test.txt
' no caminho de destino com o nome da configuração dentro. Eu adicionei diferentes maneiras de depurar seu script postbuild (caixa de mensagem, som, mensagem na saída)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
fonte
O comando Set-ExecutePolicy definirá temporariamente a política de execução na sessão atual. Se você definir isso no PowerShell e executar o comando post build em vs, você ainda não terá permissão. Então defina primeiro e depois execute o seu script ps1 como abaixo
fonte
Em vez de bagunçar as configurações de todo o sistema e ter que diferenciar entre ambientes de 32 e 64 bits, uma abordagem muito mais fácil e confiável é especificar
ExecutionPolicy
na chamada para PowerShell, da seguinte maneira: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
Observe no código acima como a chamada
Get-ExecutionPolicy
informa o modo atual. Observe também como esse modo é especificado na chamada do próprio PowerShell, que pode ser combinado com um nome de arquivo de script:conteúdo test.ps1:
echo ('The current policy is ' + (Get-ExecutionPolicy)).ToString()
Chamar test.ps1 com
Unrestricted
política em um sistema com scripts desativados:C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted -file test.ps1 The current policy is Unrestricted
Observe também que a chamada acima não requer direitos de administrador, portanto, pode ser chamada na etapa de pré-criação do Visual Studio ou semelhante.
fonte
Antes de chamar o script do power-shell do visual studio, defina ExecutionPolicy para a
RemoteSigned
partir da janela do power-shell assim ...Set-ExecutionPolicy -Scope CurrentUser; ExecutionPolicy: RemoteSigned;
em seguida, chame o script do PowerShell da seguinte maneira ...
(não há necessidade de passar o caminho completo do arquivo "powershell.exe")
então, no script, você sempre pode ler o parâmetro assim ...
param([string]$SolutionDir, [string]$ProjectPath); #Write-Host ($SolutionDir +" Call this script with following aruments"); #Write-Host ($ProjectPath +" Call this script with following aruments");
fonte
Eu fiz isso com o comando abaixo no comando pós-compilação mesmo:
PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(SolutionDir)AutomationScript\DBAutomationScript.ps1 -target $(SolutionDir)MUFG.SECMOD.Data\SqlScripts -generatedFileName $(SolutionDir)MUFG.SECMOD.Data\SqlScripts\DeploymentDBScript.sql
Conteúdo de DBAutomationScript.ps1:
param ([string]$target, [string]$generatedFileName)
fonte