101 votes

Après l'événement de construction, exécutez PowerShell

Est-il possible de configurer un projet .NET avec un événement post build pour exécuter un script powershell ? J'utilise ce script pour générer certains fichiers.

Aussi, puis-je passer si c'est un build debug ou release à script. Un exemple de ceci serait génial.

130voto

JPBlanc Points 26156

Voici un exemple :

Tout d'abord Vous devez être conscient du fait que PowerShell doit être configuré pour exécuter des scripts. La ligne suivante permet à PowerShell d'exécuter les scripts :

Set-ExecutionPolicy RemoteSigned

Mention spéciale ici si vous utilisez un système 64bits, vous devez tenir compte du fait que 'devenv.exe ' l'exécutable de Visual Studio 2010 est un exe 32Bits, vous devez donc autoriser PowerShell 32 à exécuter des scripts.

Une fois ici, vous pouvez aller dans les propriétés de votre projet et configurer le post build comme indiqué ci-dessous :

Post build in VS 2010

Par exemple :

Example of postbuild with powershell

Voici le fichier ' psbuild.ps1 ', il crée un ' test.txt dans le chemin cible avec le nom de la configuration à l'intérieur. J'ai mis en commentaire différentes façons de déboguer votre postbuild script (boîte de message, son, message sur la sortie)

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 votes

Bonne réponse. J'ajouterais seulement que vous ne devriez pas définir la politique d'exécution sur unrestricted, mais plutôt sur remotesigned. Unrestricted laisse tout script s'exécuter, alors que remotesigned exige que les script téléchargés soient signés avec une clé de confiance.

2 votes

Hum, est-ce que vous testez le téléchargement d'un fichier .PS1 sur un disque Fat32 ou l'utilisation d'un FTP cmdline basique pour télécharger un fichier .PS1 avec "remotesigned" ? n'est-ce pas une sorte de "smoky security" ?

4 votes

+1 pour la mention spéciale pour les systèmes 64 bits - je devenais fou jusqu'à ce que je lise que je devais aussi autoriser l'exécution dans le PowerShell 32 bits. Merci !

19voto

Ariwibawa Points 327

La commande Set-ExecutePolicy permet de définir temporairement la politique d'exécution dans la session en cours. Si vous définissez ceci dans powershell et exécutez la commande post build dans vs vous obtiendrez toujours not allowed. Donc définissez d'abord puis exécutez votre ps1 script comme ci-dessous

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

15voto

Michael Points 1337

Au lieu de s'embrouiller avec les paramètres du système et de devoir faire la différence entre les environnements 32 et 64 bits, une solution beaucoup plus simple consiste à utiliser un système de gestion de l'information. plus facile et plus fiable L'approche consiste à spécifier le ExecutionPolicy dans l'appel à PowerShell, comme suit :

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

Notez dans le code ci-dessus comment l'appel Get-ExecutionPolicy vous indique le mode actuel. Notez également comment ce mode est spécifié dans l'appel à PowerShell lui-même, qui peut être combiné avec un nom de fichier script :

test.ps1 contenu :

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

Appeler test.ps1 avec Unrestricted sur un système ayant scripts désactivé :

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

Notez également que l'appel ci-dessus fait no nécessite des droits d'administrateur, de sorte qu'il peut être appelé dans l'étape de pré-construction de Visual Studio ou similaire.

11voto

Narottam Points 159

Avant d'appeler power-shell script à partir de visual studio, définissez la ExecutionPolicy à RemoteSigned à partir de la fenêtre Power-Shell comme ceci...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

puis appeler powershell script de la manière suivante...

(il n'est pas nécessaire de passer le chemin complet du fichier "powershell.exe")

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

enter image description here

alors dans le script, vous pouvez toujours lire le paramètre comme ceci...

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

9voto

jnm Points 61

Je l'ai fait avec la commande ci-dessous dans la commande even post-build :

PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(SolutionDir)AutomationScript\DBAutomationScript.ps1 -target $(SolutionDir)MUFG.SECMOD.Data\SqlScripts -generatedFileName $(SolutionDir)MUFG.SECMOD.Data\SqlScripts\DeploymentDBScript.sql

Contenu de DBAutomationScript.ps1 :

param ([string]$target, [string]$generatedFileName)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X