Post-Build-Ereignis PowerShell ausführen

82

Ist es möglich, ein .NET-Projekt mit einem Post-Build-Ereignis einzurichten, um ein Powershell-Skript auszuführen? Ich verwende dieses Skript, um einige Dateien zu generieren.

Kann ich auch übergeben, ob es sich um ein Debug- oder Release-Build für ein Skript handelt? Ein Beispiel dafür wäre großartig.

Amateur
quelle

Antworten:

117

Hier ist ein Beispiel :

Zunächst einmal : Sie müssen sich der Tatsache bewusst sein, dass PowerShell für die Ausführung von Skripten konfiguriert sein muss. In der folgenden Zeile kann PowerShell Skripts ausführen:

Set-ExecutionPolicy RemoteSigned

Besondere Erwähnung hier : Wenn Sie ein 64-Bit-System ausführen, müssen Sie darauf achten, dass 'devenv.exe ' die ausführbare Datei von Visual Studio 2010 eine 32-Bit-Exe ist. Daher müssen Sie PowerShell 32 erlauben, Skripts auszuführen.

Sobald Sie hier sind, können Sie in Ihre Projekteigenschaften gehen und den Post-Build wie hier unter (sorry auf Französisch) gezeigt konfigurieren:

Post Build in VS 2010

Zum Beispiel :

Beispiel eines Postbuilds mit Powershell

Hier ist die Datei ' psbuild.ps1', sie erstellt ein ' test.txt' im Zielpfad mit dem darin enthaltenen Konfigurationsnamen. Ich habe verschiedene Möglichkeiten zum Debuggen Ihres Postbuild-Skripts kommentiert (Meldungsfeld, Sound, Meldung in der Ausgabe).

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
quelle
8
Gute Antwort. Ich möchte nur hinzufügen, dass Sie die Ausführungsrichtlinie nicht auf uneingeschränkt, sondern auf Remotesigned setzen sollten. Mit "Uneingeschränkt" kann jedes Skript ausgeführt werden, während für Remotesigned heruntergeladene Skripte mit einem vertrauenswürdigen Schlüssel signiert werden müssen.
Beefarino
2
Hum testen Sie, um eine .PS1-Datei auf ein Fat32-Laufwerk herunterzuladen, oder verwenden Sie einfaches cmdline-FTP, um eine .PS1-Datei mit "remotesigned" herunterzuladen? ist es nicht eine Art "rauchige Sicherheit"?
JPBlanc
3
+1 für die besondere Erwähnung für 64-Bit-Systeme - Ich war verrückt, bis ich las, dass ich auch die Ausführung in der 32-Bit-PowerShell zulassen musste. Vielen Dank!
Guðmundur H
Leider gibt es keine Bilddateien: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna
7
Wenn Sie für den Pfad Folgendes verwenden: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ Powershell.exe, wird die 64-Bit-Version von Powershell aufgerufen. % systemroot% \ sysnative ist ein spezieller Alias, der den Redirector anweist, die Umleitung zu beenden und echten Zugriff auf% systemroot% \ system32 zu ermöglichen.
Peter Oehlert
14

Der Befehl Set-ExecutePolicy legt die Ausführungsrichtlinie für die aktuelle Sitzung vorübergehend fest. Wenn Sie dies in Powershell einstellen und den Befehl post build in vs ausführen, werden Sie immer noch nicht zugelassen. Stellen Sie also zuerst ein und führen Sie dann Ihr ps1-Skript wie unten aus

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

Anstatt mit systemweiten Einstellungen herumzuspielen und zwischen 32- und 64-Bit-Umgebungen unterscheiden zu müssen, ist es viel einfacher und zuverlässiger , die ExecutionPolicybeim Aufruf von PowerShell wie folgt anzugeben :

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

Beachten Sie im obigen Code, wie der Aufruf Get-ExecutionPolicyIhnen den aktuellen Modus anzeigt. Beachten Sie auch, wie dieser Modus im Aufruf von PowerShell selbst angegeben wird, der mit einem Skriptdateinamen kombiniert werden kann:

test.ps1 Inhalt:

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

Aufruf von test.ps1 mit UnrestrictedRichtlinie auf einem System mit deaktivierten Skripten:

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

Beachten Sie auch , dass der obige Aufruf nicht nicht benötigen Administratorrechte, so kann es in Visual Studio Pre-Build - Schritt oder ähnlich bezeichnet werden.

Michael
quelle
9

Stellen Sie die ExecutionPolicy vor dem Aufrufen des Power-Shell-Skripts aus Visual Studio RemoteSignedwie folgt auf Power-Shell-Fenster ein ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

Rufen Sie dann das Powershell-Skript folgendermaßen auf ...

(Keine Notwendigkeit, den vollständigen Dateipfad "Powershell.exe" zu übergeben)

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

Geben Sie hier die Bildbeschreibung ein

dann können Sie im Skript den Parameter immer so lesen ...

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
quelle
5

Ich habe es mit dem folgenden Befehl im Post-Build-Even-Befehl gemacht:

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

Inhalt von DBAutomationScript.ps1:

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