2011-06-28 19 views
65

¿Es posible configurar un proyecto .net con un evento de compilación posterior para ejecutar un script de powershell? Estoy usando esta secuencia de comandos para generar algunos archivos. También puedo pasar si se trata de una compilación de debug o release a script. Un ejemplo de esto sería genial.Post evento de compilación ejecutar powershell

Respuesta

92

Aquí es una ejemplo:

Antes que nada: debe tener en cuenta que PowerShell debe configurarse para ejecutar scripts. La siguiente línea permite PowerShell para ejecutar scripts:

Set-ExecutionPolicy RemoteSigned 

mención especial aquí: si está ejecutando un sistema de 64 bits que tiene que tener cuidado de que 'devenv.exe' Visual Studio 2010 ejecutable es un exe de 32 bits, por lo que debe permitir que PowerShell 32 ejecute scripts.

Una vez aquí se puede ir en las propiedades del proyecto y configurar posterior acumulación como se muestra aquí bajo (lo siento en francés):

Post build in VS 2010

Por ejemplo:

Example of postbuild with powershell

Aquí es el archivo 'psbuild.ps1', crea un 'test.txt' en la ruta de destino con el nombre de configuración dentro. Pongo en el comentario de diferentes maneras para depurar la secuencia de comandos postbuild (cuadro de mensaje, sonido, mensaje en la salida)

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 
+9

¡Guau, esa fue realmente una respuesta! :) –

+8

Buena respuesta. Solo agregaría que no debe establecer la política de ejecución para que no sea restringida, sino para crear una firma remota en su lugar. Sin restricciones permite ejecutar cualquier script, mientras que remotesigned requiere que los scripts descargados se firmen con una clave de confianza. – beefarino

+2

Hum, ¿realiza una prueba para descargar un archivo .PS1 en una unidad Fat32 o utiliza el FTP básico de cmdline para descargar un archivo .PS1 con "remotesigned"? ¿no es una especie de "seguridad humeante"? – JPBlanc

3

en lugar de jugar con la configuración de todo el sistema y tener que diferenciar entre los entornos de 32 y 64 bits, una mucho más fácil y más fiable enfoque consiste en especificar el ExecutionPolicy en la llamada a PowerShell, de la siguiente manera:

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 

Nota en el código anterior cómo llamar Get-ExecutionPolicy le indica el modo actual. También tenga en cuenta cómo se especifica esta modalidad en la llamada a sí PowerShell, que se puede combinar con un nombre de archivo de secuencia de comandos:

contenidos test.ps1:

echo ('The current policy is ' + (Get-ExecutionPolicy)).ToString() 

probar la llamada.PS1 con Unrestricted política en un sistema que tiene las secuencias de comandos para minusválidos:

C:\Users\xyz>PowerShell -ExecutionPolicy Unrestricted -file test.ps1 
The current policy is Unrestricted 

También tenga en cuenta que la llamada anterior hace no requieren derechos de administrador, por lo que se puede llamar en Pre-Construcción de Visual Studio Paso o similar.

1

Antes de llamar a la escritura de potencia-shell desde Visual Studio, establezca la ExecutionPolicy a restricciones de la ventana de energía de concha como esto ...

Set-ExecutionPolicy -Scope CurrentUser; 
ExecutionPolicy: unrestricted; 

el guión de potencia de concha llamada de la siguiente manera ...

(sin necesidad de pasar ruta completa del archivo "powershell.exe")

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

enter image description here

continuación, en la secuencia de comandos, siempre se puede leer el parámetro como este ...

param([string]$SolutionDir, 
    [string]$ProjectPath); 
#Write-Host ($SolutionDir +" Call this script with following aruments"); 
#Write-Host ($ProjectPath +" Call this script with following aruments"); 
4

comando Set-ExecutePolicy, Grupo temporal política de ejecución en virtud de la sesión actual. Si configura esto en powershell y ejecuta el comando de compilación posterior en vs, seguirá sin estar permitido. Así que establezca primero que ejecute su script ps1 como el siguiente

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath) 
Cuestiones relacionadas