Zdarzenie po kompilacji wykonaj PowerShell

85

Czy można skonfigurować projekt .NET ze zdarzeniem po kompilacji, aby wykonać skrypt PowerShell? Używam tego skryptu do generowania plików.

Mogę również przekazać, czy jest to kompilacja debugowania lub wydania do skryptu. Przykład tego byłby świetny.

amator
źródło

Odpowiedzi:

118

Oto przykład :

Po pierwsze : musisz mieć świadomość, że PowerShell musi być skonfigurowany do wykonywania skryptów. Poniższy wiersz umożliwia programowi PowerShell wykonywanie skryptów:

Set-ExecutionPolicy RemoteSigned

Specjalna wzmianka tutaj : jeśli używasz 64-bitowego systemu, musisz uważać na fakt, że „devenv.exe ” plik wykonywalny Visual Studio 2010 jest plikiem exe 32-bitowym, więc musisz pozwolić PowerShell 32 na wykonywanie skryptów.

Tutaj możesz przejść do właściwości projektu i skonfigurować post build, jak pokazano tutaj (przepraszam po francusku):

Post build w VS 2010

Na przykład :

Przykład postbuildingu z PowerShell

Oto plik „ psbuild.ps1”, tworzy „ test.txt” w ścieżce docelowej z nazwą konfiguracji w środku. W komentarzu umieściłem różne sposoby debugowania skryptu postbuild (komunikat, dźwięk, komunikat na wyjściu)

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
źródło
8
Dobra odpowiedź. Dodam tylko, że nie należy ustawiać polityki wykonywania na nieograniczoną, ale na zdalną. Bez ograniczeń pozwala na wykonanie dowolnego skryptu, podczas gdy zdalne sterowanie wymaga, aby pobrane skrypty były podpisane zaufanym kluczem.
beefarino
2
Hmm, testujesz, aby pobrać plik .PS1 na dysk Fat32, czy użyć podstawowego polecenia FTP z linią cmd do pobrania pliku .PS1 z "zdalnie sterowanym"? czy nie jest to rodzaj „zadymionego zabezpieczenia”?
JPBlanc
3
+1 za specjalne wyróżnienie dla systemów 64-bitowych - szalałem, dopóki nie przeczytałem, że potrzebowałem również zezwolić na wykonywanie w 32-bitowym PowerShellu. Dzięki!
Guðmundur H
niestety nie ma plików graficznych: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna
7
Jeśli użyjesz: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe jako ścieżka, zostanie wywołana 64-bitowa wersja programu PowerShell. % systemroot% \ sysnative to specjalny alias informujący readresatora o konieczności zaprzestania przekierowywania i umożliwienia rzeczywistego dostępu do% systemroot% \ system32.
Peter Oehlert,
15

polecenie Set-ExecutePolicy tymczasowo ustawi zasady wykonywania w bieżącej sesji. Jeśli ustawisz to w programie PowerShell i uruchomisz polecenie po kompilacji w vs, nadal nie będziesz mógł. Więc ustaw najpierw, a następnie uruchom skrypt ps1 jak poniżej

powershell -ExecutionPolicy Unrestricted $(ProjectDir)Deploy.ps1 -ProjectDir $(ProjectDir) -TargetPath $(TargetPath)
Ariwibawa
źródło
11

Zamiast majstrować przy ustawieniach całego systemu i rozróżniać środowiska 32- i 64-bitowe, znacznie łatwiejszym i bardziej niezawodnym podejściem jest określenie ExecutionPolicyw wywołaniu programu PowerShell w następujący sposób:

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

Zwróć uwagę w powyższym kodzie, w jaki sposób wywołanie Get-ExecutionPolicyinformuje o aktualnym trybie. Zwróć również uwagę, jak ten tryb jest określony w wywołaniu samego programu PowerShell, który można połączyć z nazwą pliku skryptu:

zawartość testu.ps1:

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

Wywołanie test.ps1 z Unrestrictedpolityką w systemie z wyłączonymi skryptami:

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

Należy również zauważyć, że powyższe wywołanie nie wymaga uprawnień administratora, więc można je wywołać w kroku poprzedzającym kompilację programu Visual Studio lub podobnym.

Michał
źródło
9

Przed wywołaniem skryptu Power-Shell z programu Visual Studio, ustaw ExecutionPolicy na RemoteSignedz okna Power-Shell w następujący sposób ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

następnie wywołaj skrypt PowerShell w następujący sposób ...

(nie ma potrzeby przekazywania pełnej ścieżki do pliku „powershell.exe”)

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

wprowadź opis obrazu tutaj

wtedy w skrypcie zawsze możesz odczytać parametr w ten sposób ...

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
źródło
6

Zrobiłem to za pomocą poniższego polecenia w poleceniu nawet po kompilacji:

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

Zawartość DBAutomationScript.ps1:

param ([string]$target, [string]$generatedFileName)
jnm
źródło