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.
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):
Par exemple :
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
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)
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)
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");
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.
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)