Derleme sonrası olay PowerShell yürütme


86

Powershell betiğini yürütmek için post build olayı içeren bir .NET projesi oluşturmak mümkün müdür? Bu komut dosyasını bazı dosyalar oluşturmak için kullanıyorum.

Ayrıca bir hata ayıklama mı yoksa sürüm derlemesi mi olduğunu komut dosyasına aktarabilirim. Bunun bir örneği harika olur.


Yanıtlar:


120

İşte bir örnek :

Her şeyden önce : PowerShell'in komut dosyalarını yürütmek için yapılandırılması gerektiğinin farkında olmalısınız. Aşağıdaki satır, PowerShell'in komut dosyalarını yürütmesine izin verir:

Set-ExecutionPolicy RemoteSigned

Burada özel bir söz : 64 bitlik bir sistem çalıştırıyorsanız, 'devenv.exe' gerçeğine dikkat etmeniz gerekir. komut dosyalarını yürütmek için PowerShell 32 izin vermeniz gerekir, böylece' Visual Studio 2010 çalıştırılabilir bir 32bit exe olduğunu.

Burada bir kez burada proje özelliklerinize gidebilir ve post yapıyı burada gösterildiği gibi yapılandırabilirsiniz (Fransızca üzgünüm):

VS 2010'da derleme sonrası

Örneğin :

Powershell ile postbuild örneği

İşte ' psbuild.ps1' dosyası , test.txtiçinde konfigürasyon adı ile hedef yolunda bir ' ' oluşturur . Postbuild betiğinizde hata ayıklamak için farklı yollar yorum ekledim (mesaj kutusu, ses, çıktıdaki mesaj)

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

8
İyi cevap. Yalnızca, yürütme politikasını sınırsız olarak ayarlamamanızı, bunun yerine yeniden imzalı olarak ayarlamanız gerektiğini ekleyeceğim. Sınırsız, herhangi bir komut dosyasının yürütülmesine izin verirken, yeniden imzalanmak, indirilen komut dosyalarının güvenilir bir anahtarla imzalanmasını gerektirir.
beefarino

2
Bir .PS1 dosyasını bir Fat32 sürücüsüne indirmeyi test ediyor musunuz yoksa tu "uzaktan imzalanmış" bir .PS1 dosyasını indirmek için temel cmdline FTP kullanıyor musunuz? bir tür "dumanlı güvenlik" değil mi?
JPBlanc

3
64bit sistemler için özel söz için +1 - Okuyana kadar deliriyordum, 32bit PowerShell'de de yürütmeye izin vermem gerekiyordu. Teşekkürler!
Guðmundur H


7
Yol için: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powershell.exe kullanırsanız, powershell'in 64 bit sürümü çağrılacaktır. % systemroot% \ sysnative, yeniden yönlendiriciye yeniden yönlendirmeyi durdurmasını ve% systemroot% \ system32'ye gerçek erişime izin vermesini söyleyen özel bir takma addır.
Peter Oehlert

15

Set-ExecutePolicy komutu, mevcut oturumda geçici olarak yürütme ilkesini ayarlayacaktır. Bunu powershell'de ayarlarsanız ve post build komutunu vs'de çalıştırırsanız, yine de izin verilmezsiniz. Öyleyse önce ayarlayın, ardından ps1 betiğinizi aşağıdaki gibi çalıştırın

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

11

Sistem genelindeki ayarlarla uğraşmak ve 32 ve 64 bit ortamları ayırt etmek zorunda kalmak yerine, çok daha kolay ve daha güvenilir bir yaklaşım, ExecutionPolicyPowerShell çağrısında aşağıdaki gibi belirtmektir :

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

Yukarıdaki koda, aramanın Get-ExecutionPolicysize geçerli modu nasıl söylediğini not edin. Ayrıca, bu modun bir komut dosyası dosya adıyla birleştirilebilen PowerShell çağrısında nasıl belirtildiğine de dikkat edin:

test.ps1 içeriği:

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

Test.ps1 çağrılıyor UnrestrictedKomut dosyalarının devre dışı bırakıldığı bir sistemde ilkeyle :

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

Ayrıca yukarıdaki çağrı unutmayın değil o Visual Studio'nun, Ön Yapı Adım veya benzeri de çağrılabilir, böylece yönetici hakları gerektirir.


9

Görsel stüdyodan power-shell betiğini çağırmadan önce, ExecutionPolicy'yi RemoteSignedpower-shell penceresinden şu şekilde ayarlayın ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

ardından powershell betiğini aşağıdaki şekilde çağırın ...

(tam "powershell.exe" dosya yolunu geçmeye gerek yoktur)

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

görüntü açıklamasını buraya girin

sonra komut dosyasında, parametreyi her zaman şu şekilde okuyabilirsiniz ...

param([string]$SolutionDir,
     [string]$ProjectPath);
#Write-Host ($SolutionDir +" Call this script with following aruments");
#Write-Host ($ProjectPath +" Call this script with following aruments");

6

Bunu, inşa sonrası bile komutta aşağıdaki komutla yaptım:

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 içeriği:

param ([string]$target, [string]$generatedFileName)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.