web-dev-qa-db-fra.com

L'événement post-build exécute 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 des fichiers.

Puis-je également passer si c'est un débogage ou une version build au script. Un exemple de cela serait formidable.

75
amateur

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 des scripts:

Set-ExecutionPolicy RemoteSigned

Mention spéciale ici: si vous utilisez un système 64 bits, vous devez prendre soin 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 la post-construction comme indiqué ci-dessous (désolé en français):

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. Je mets en commentaire différentes façons de déboguer votre script de post-construction (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
111
JPBlanc

la commande Set-ExecutePolicy définira temporairement la politique d'exécution sous la session en cours. Si vous le définissez dans powershell et exécutez la commande post build dans vs, vous ne serez toujours pas autorisé. Alors commencez par exécuter votre script ps1 comme ci-dessous

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

Avant d'appeler le script Power-Shell à partir de Visual Studio, définissez ExecutionPolicy sur RemoteSigned à partir de la fenêtre Power-Shell comme ceci ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

puis appelez le script powershell de la manière suivante ...

(pas besoin de passer le chemin complet du fichier "powershell.exe")

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

enter image description here

puis 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");
8
Narottam Goyal

Au lieu de jouer avec les paramètres à l'échelle du système et de faire la différence entre les environnements 32 et 64 bits, une approche beaucoup plus plus facile et plus fiable 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 appeler 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 de script:

contenu de test.ps1:

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

Appel de test.ps1 avec la politique Unrestricted sur un système dont les scripts sont désactivés:

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

Notez également que l'appel ci-dessus ne nécessite pas de droits d'administrateur, il peut donc être appelé dans l'étape de pré-génération de Visual Studio ou similaire.

7
Michael

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