Evento pós-compilação execute o PowerShell

86

É 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.

amador
fonte

Respostas:

120

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):

Pós-construção no VS 2010

Por exemplo :

Exemplo de postbuild com PowerShell

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
JPBlanc
fonte
8
Boa resposta. Eu apenas acrescentaria que você não deve definir a política de execução como irrestrita, mas remotamente. Irrestrito permite a execução de qualquer script, enquanto remotamente requer que os scripts baixados sejam assinados com uma chave confiável.
beefarino
2
Você testa para baixar um arquivo .PS1 em uma unidade Fat32 ou usa FTP cmdline básico para baixar um arquivo .PS1 com "remotesigned"? não é uma espécie de "segurança enfumaçada"?
JPBlanc
3
+1 pela menção especial para sistemas de 64 bits - Eu estava ficando louco até que li que também precisava permitir a execução no PowerShell de 32 bits. Obrigado!
Guðmundur H
infelizmente não há arquivos de imagem: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna
7
Se você usar: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe para o caminho, a versão de 64 bits do powershell será chamada. % systemroot% \ sysnative é um apelido especial para dizer ao redirecionador para parar de redirecionar e permitir acesso real a% systemroot% \ system32.
Peter Oehlert
15

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

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)
Ariwibawa
fonte
11

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 ExecutionPolicyna 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-ExecutionPolicyinforma 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 Unrestrictedpolí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.

Michael
fonte
9

Antes de chamar o script do power-shell do visual studio, defina ExecutionPolicy para a RemoteSignedpartir 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")

powershell.exe $(SolutionDir)Setup.ps1 -SolutionDir $(SolutionDir) -ProjectPath $(ProjectPath)

insira a descrição da imagem aqui

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");
Narottam Goyal
fonte
6

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)
jnm
fonte