पोस्ट बिल्ड ईवेंट पॉवरशेल निष्पादित करें


85

क्या पावर स्क्रिप्ट को निष्पादित करने के लिए पोस्ट बिल्ड इवेंट के साथ .NET प्रोजेक्ट सेट करना संभव है? मैं कुछ फ़ाइलों को उत्पन्न करने के लिए इस स्क्रिप्ट का उपयोग कर रहा हूं।

मैं यह भी पास कर सकता हूं कि क्या यह एक डिबग है या स्क्रिप्ट का निर्माण जारी है। इसका एक उदाहरण बहुत अच्छा होगा।


जवाबों:


118

यहाँ एक उदाहरण है :

सबसे पहले : आपको इस तथ्य के बारे में पता होना चाहिए कि स्क्रिप्ट निष्पादित करने के लिए PowerShell को कॉन्फ़िगर करना होगा। निम्न पंक्ति PowerShell को स्क्रिप्ट निष्पादित करने की अनुमति देती है:

Set-ExecutionPolicy RemoteSigned

यहां विशेष उल्लेख : यदि आप 64 बिट्स सिस्टम चला रहे हैं तो आपको इस तथ्य का ध्यान रखना होगा कि विजुअल स्टूडियो 2010 का 'devenv.exe ' निष्पादन योग्य 32 बिट्स है, इसलिए आपको स्क्रिप्ट्स को निष्पादित करने के लिए पावरशेल 32 को अनुमति देने की आवश्यकता है।

एक बार यहां आप अपनी परियोजना संपत्तियों में जा सकते हैं और पोस्ट निर्माण को कॉन्फ़िगर कर सकते हैं जैसा कि यहां दिखाया गया है (क्षमा करें)

वीएस 2010 में पोस्ट बिल्ड

उदाहरण के लिए :

शक्तियां के साथ पोस्टपोन का उदाहरण

यहाँ फ़ाइल ' psbuild.ps1' है, यह test.txtअंदर विन्यास नाम के साथ लक्ष्य पथ में एक ' ' बनाता है । मैंने आपकी पोस्ट स्क्रिप्ट (संदेश बॉक्स, ध्वनि, संदेश आउटपुट पर) को डिबग करने के लिए अलग-अलग तरीकों से टिप्पणी की

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
अच्छा उत्तर। मैं केवल यह जोड़ना चाहूंगा कि आपको निष्पादन नीति को अप्रतिबंधित करने के लिए नहीं, बल्कि इसके स्थान पर निरस्त करना चाहिए। अप्रतिबंधित किसी भी स्क्रिप्ट को निष्पादित करने देता है, जबकि रीमोसिग्नेटेड को डाउनलोड की जाने वाली स्क्रिप्ट को एक विश्वसनीय कुंजी के साथ हस्ताक्षर करने की आवश्यकता होती है।
बीफारिनो

2
हम एक Fat32 ड्राइव पर .PS1 फ़ाइल को डाउनलोड करने के लिए परीक्षण करते हैं या "remotesign" के साथ .PS1 फ़ाइल डाउनलोड करने के लिए बुनियादी cmdline FTP का उपयोग करते हैं? क्या यह "धुँआधार सुरक्षा" का एक प्रकार नहीं है?
JPBlanc

3
64 बिट सिस्टम के लिए विशेष उल्लेख के लिए +1 - मैं पागल हो रहा था जब तक मैंने पढ़ा कि मुझे 32 बिट पॉवरशेल में निष्पादन की अनुमति देने की आवश्यकता है। धन्यवाद!
गुम्मंडूर H

unfortunatelly कोई छवि फ़ाइलें नहीं है: i.stack.imgur.com/gZoPi.png i.stack.imgur.com/VTIRW.png
Andrzej Martyna

7
यदि आप उपयोग करते हैं: c: \ windows \ sysnative \ windowspowershell \ v1.0 \ powerhell.exe पथ के लिए, तो शब्‍दशाल का 64 बिट संस्‍करण मंगाया जाएगा। % systemroot% \ sysnative रीडायरेक्टर को पुनर्निर्देशन को रोकने के लिए बताने के लिए एक विशेष उपनाम है, और% systemroot% \ system32 के लिए वास्तविक पहुंच की अनुमति देता है।
पीटर ओहेलर्ट

15

आदेश सेट- ExecutePolicy वर्तमान सत्र के तहत अस्थायी रूप से निष्पादन नीति निर्धारित करेगा। यदि आप इसे पावरशेल में सेट करते हैं और बनाम में पोस्ट बिल्ड कमांड चलाते हैं तो भी आपको अनुमति नहीं मिलेगी। तो पहले सेट करें फिर अपने ps1 स्क्रिप्ट को bellow की तरह चलाएं

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

11

सिस्टम-वाइड सेटिंग्स के साथ खिलवाड़ करने और 32 और 64-बिट वातावरण के बीच अंतर करने के बजाय, बहुत आसान और अधिक विश्वसनीय दृष्टिकोण ExecutionPolicyPowerShell में कॉल को निर्दिष्ट करना है, निम्नानुसार है:

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

उपरोक्त कोड में ध्यान दें कि कैसे कॉलिंग Get-ExecutionPolicyआपको वर्तमान मोड बताता है। यह भी नोट करें कि यह मोड खुद को PowerShell में कॉल में कैसे निर्दिष्ट किया गया है, जिसे स्क्रिप्ट फ़ाइल नाम के साथ जोड़ा जा सकता है:

test.ps1 सामग्री:

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

Unrestrictedस्क्रिप्ट को अक्षम करने वाली प्रणाली पर नीति के साथ test.ps1 को कॉल करना :

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

यह भी ध्यान दें कि उपरोक्त कॉल के लिए व्यवस्थापक अधिकारों की आवश्यकता नहीं है, इसलिए इसे विज़ुअल स्टूडियो के प्री-बिल्ड स्टेप या समान में कहा जा सकता है।


9

दृश्य स्टूडियो से पावर-शेल स्क्रिप्ट को कॉल करने से पहले, ExecutionPolicy को RemoteSignedपावर-शेल विंडो से इस तरह सेट करें ...

Set-ExecutionPolicy -Scope CurrentUser;
ExecutionPolicy: RemoteSigned;

फिर निम्नलिखित तरीके से शिल्पी स्क्रिप्ट को कॉल करें ...

(पूर्ण "शक्तियां। exe" फ़ाइल पथ को पारित करने की आवश्यकता नहीं है)

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

यहां छवि विवरण दर्ज करें

फिर स्क्रिप्ट में, आप हमेशा इस तरह पैरामीटर पढ़ सकते हैं ...

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

6

मैंने इसे निर्माण के बाद के कमांड में नीचे कमांड के साथ बनाया:

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 सामग्री:

param ([string]$target, [string]$generatedFileName)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.