webentwicklung-frage-antwort-db.com.de

Führen Sie PowerShell nach dem Build-Ereignis aus

Ist es möglich, ein .NET-Projekt mit einem Postbuild-Ereignis einzurichten, um ein Powershell-Skript auszuführen? Ich benutze 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 toll.

75
amateur

Hier ist ein Beispiel :

Zuallererst: 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 verwenden, müssen Sie darauf achten, dass 'devenv.exe 'Die ausführbare Datei von Visual Studio 2010 ist eine 32-Bit-Datei, daher müssen Sie PowerShell 32 die Ausführung von Skripten erlauben.

Sobald Sie hier sind, können Sie Ihre Projekteigenschaften aufrufen und den Postbuild konfigurieren, wie hier unter (Entschuldigung in Französisch) gezeigt:

Post build in VS 2010

Zum Beispiel :

Example of postbuild with powershell

Hier ist die Datei 'psbuild.ps1 ', es entsteht ein' test.txt 'im Zielpfad mit dem darin enthaltenen Konfigurationsnamen. Ich habe verschiedene Möglichkeiten zum Debuggen Ihres Postbuild-Skripts in Kommentare eingefügt (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
111
JPBlanc

mit dem Befehl Set-ExecutePolicy wird die Ausführungsrichtlinie für die aktuelle Sitzung vorübergehend festgelegt. Wenn Sie dies in Powershell setzen und den Befehl post build in vs ausführen, werden Sie trotzdem nicht zugelassen. Also erst einstellen und dann dein ps1-Skript wie folgt ausführen

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

Bevor Sie das Power-Shell-Skript von Visual Studio aus aufrufen, setzen Sie die ExecutionPolicy im Power-Shell-Fenster wie folgt auf RemoteSigned ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

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

(kein vollständiger Dateipfad für "powershell.exe" erforderlich)

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

enter image description here

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

Anstatt mit systemweiten Einstellungen zu experimentieren und zwischen 32- und 64-Bit-Umgebungen unterscheiden zu müssen, besteht ein viel einfacher und zuverlässigerer Ansatz darin, das ExecutionPolicy im Aufruf von PowerShell anzugeben. wie folgt:

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 von Get-ExecutionPolicy zeigt den aktuellen Modus an. Beachten Sie auch, wie dieser Modus im Aufruf von PowerShell selbst angegeben ist, der mit einem Skriptdateinamen kombiniert werden kann:

inhalt von test.ps1:

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

Aufruf von test.ps1 mit der Richtlinie Unrestricted 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 Administratorrechte erfordert, sodass er in Visual Studios Pre-Build-Schritt oder ähnlichem aufgerufen werden kann.

7
Michael

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

DBAutomationScript.ps1-Inhalt:

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