मैं .NET 4 रनटाइम के साथ पावरशेल कैसे चला सकता हूं?


234

मैं एक PowerShell स्क्रिप्ट अपडेट कर रहा हूं जो कुछ .NET असेंबली का प्रबंधन करती है। स्क्रिप्ट को .NET 2 के विरुद्ध निर्मित असेंबली के लिए लिखा गया था (फ्रेमवर्क का वही संस्करण जो PowerShell के साथ चलता है), लेकिन अब .NET 4 असेंबली और साथ ही .NET 2 असेंबली के साथ काम करने की आवश्यकता है।

चूंकि .NET 4 फ्रेमवर्क के पुराने संस्करणों के विरुद्ध बनाए गए रनिंग एप्लिकेशन का समर्थन करता है, ऐसा लगता है कि सबसे आसान समाधान .NET 4 रनटाइम के साथ पावरशेल को लॉन्च करना है जब मुझे .NET 4 विधानसभाओं के खिलाफ इसे चलाने की आवश्यकता होती है।

मैं .NET 4 रनटाइम के साथ पावरशेल कैसे चला सकता हूं?



8
इन दिनों सबसे आसान समाधान Powershell 3.0 CTP को स्थापित करना होगा जो CLRVersion: 4.0.30319.1 का उपयोग करता है।
जोन जेड

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

1
एक गैर-प्रणालीबद्ध और फिल्महीन समाधान के लिए इस उत्तर को
vkrzv

जवाबों:


147

PowerShell (इंजन) .NET 4.0 के तहत ठीक चलता है। PowerShell (कंसोल होस्ट और ISE ), केवल इसलिए नहीं कि वे .NET के पुराने संस्करणों के विरुद्ध संकलित किए गए थे। एक रजिस्ट्री सेटिंग है जो .NET फ्रेमवर्क लोड किए गए सिस्टमवाइड को बदलेगी , जो बदले में PowerShell को .NET 4.0 कक्षाओं का उपयोग करने की अनुमति देगा:

reg add hklm\software\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1
reg add hklm\software\wow6432node\microsoft\.netframework /v OnlyUseLatestCLR /t REG_DWORD /d 1

.NET 4.0 का उपयोग करने के लिए बस ISE को अपडेट करने के लिए, आप कॉन्फ़िगरेशन ($ psHome \ powerhell_ise.exe.config) फ़ाइल को इस तरह से बदल सकते हैं:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
      <supportedRuntime version="v4.0.30319" />
    </startup>
</configuration>

आप .NET 4.0 अनुप्रयोगों का निर्माण कर सकते हैं, जो कि PowerShell API (System.Management.Automation.PowerShell) का उपयोग करके PowerShell को ठीक कहते हैं, लेकिन ये चरण .NET 4.0 के तहत काम करने के लिए इन-द-बॉक्स PowerShell होस्ट प्राप्त करने में मदद करेंगे।


जब आपको उनकी कोई आवश्यकता न हो तो रजिस्ट्री कुंजियाँ हटा दें। ये मशीन-वाइड की हैं और .NET। 4.0, यहाँ तक कि .net 2 और .net 3.5 का उपयोग करते हुए सभी अनुप्रयोगों को जबरन माइग्रेट करते हैं



9
बस स्पष्ट होने के लिए, powerhell.exe (कंसोल होस्ट ऐप) अपने आप में एक मूल एप्लिकेशन है - प्रबंधित नहीं।
कीथ हिल

4
मैंने अपनी समस्या ऊपर से समझी। 64-बिट OS पर चलने पर आपको कॉन्फ़िगर फ़ाइल को 64-बिट निर्देशिका में रखना होगा। 32-बिट शक्तियॉ निष्पादन योग्य लगता है कि परिवर्तन को वहीं से ठीक किया जाए।
क्रिस मैकेंजी

11
बस एक छोटी सी सलाह। जब आपको उनकी कोई आवश्यकता न हो तो रजिस्ट्री कुंजियाँ हटा दें। मैं सिर्फ एक समय खो दिया है यह पता लगाने की कोशिश कर रहा हूं कि मैं कुछ .NET 3.5 परियोजना क्यों नहीं बना सका, जिस पर मैं काम कर रहा हूं।
क्लार्क

7
यदि आप मल्टी-टारगेटिंग कर रहे हैं (अर्थात VS2010 में .NET 2.0 एप्स लिख रहे हैं) तो प्रस्तावित रजिस्ट्री संशोधन समाधान के बुरे दुष्प्रभाव हैं। खबरदार।
टॉड स्प्रंग

9
ध्यान दें कि Microsoft ऐसा करने के खिलाफ कड़ी चेतावनी देता है: "जबकि PowerShell 2.0 को .NET फ्रेमवर्क 4.0 के साथ चलाने के लिए बाध्य करना संभव है। विभिन्न तंत्रों का उपयोग करके जैसे PowerShell के लिए एक कॉन्फिग फ़ाइल बनाना या रजिस्ट्री का संपादन करना, ये तंत्र समर्थित नहीं हैं और हो सकते हैं अन्य PowerShell कार्यक्षमता पर नकारात्मक साइड इफेक्ट जैसे PowerShell रीमोटिंग और cmdlets मिश्रित-मोड असेंबली के साथ। " connect.microsoft.com/PowerShell/feedback/details/525435/… Powershell 3.0 में .NET 4.0 का मूल समर्थन है।
टिम्बो

238

मुझे जो सबसे अच्छा समाधान मिला है वह है ब्लॉग पोस्ट में PowerShell के साथ .NET के नए संस्करण (एस) का उपयोग करना । यह .NET 4 असेंबली के साथ powerhell.exe को चलाने की अनुमति देता है।

बस संशोधित (या बनाएं) $pshome\powershell.exe.configताकि इसमें निम्नलिखित शामिल हों:

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
        <supportedRuntime version="v4.0.30319"/> 
        <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 

अतिरिक्त, त्वरित सेटअप नोट्स:

स्थान और फाइलें कुछ हद तक प्लेटफॉर्म पर निर्भर हैं; हालाँकि, आपको आपके लिए समाधान का काम करने के तरीके के बारे में जानकारी देगा।

  • आप cd $pshome पॉवर्सशेल विंडो (डॉस प्रॉम्प्ट से काम नहीं करता है) में निष्पादित करके अपने कंप्यूटर पर पावरशेल का स्थान पा सकते हैं ।
    • पथ कुछ इस तरह होगा (उदाहरण) C:\Windows\System32\WindowsPowerShell\v1.0\
  • कॉन्फ़िगरेशन को डालने के लिए फ़ाइल नाम है: powershell.exe.configयदि आपका PowerShell.exeनिष्पादन हो रहा है (यदि आवश्यक हो तो कॉन्फ़िगरेशन फ़ाइल बनाएं)।
    • यदि PowerShellISE.Exeचल रहा है, तो आपको इसकी साथी कॉन्फ़िगरेशन फ़ाइल बनाने की आवश्यकता हैPowerShellISE.Exe.config

23
निश्चित रूप से इसे करने का सही तरीका है। यह केवल पॉवर्सशेल के व्यवहार को बदल देता है, आपकी मशीन पर हर दूसरे .NET ऐप को नहीं ...
Erik A. Brandstadmoen

4
यह अच्छी तरह से काम करता है लेकिन आपके सभी PowerShell को प्रभावित करता है। यदि आप चाहते हैं कि कुछ कार्यक्षमता केवल पॉवरशेल फ़ोल्डर की एक प्रतिलिपि बनाएँ और फिर फ़ाइल को वहाँ संपादित करें।
मैट

8
मैंने ऊपर बताए अनुसार एक फ़ाइल जोड़ी। हालाँकि, मैं अब उस फ़ाइल के साथ PowerShell को नहीं चला सकता - मुझे यह त्रुटि मिलती है "फ़ाइल के लिए वॉल्यूम बाहरी रूप से बदल दिया गया है ताकि खोली गई फ़ाइल अब मान्य न हो।" कोई विचार?
जोशेल

13
@JoshL - 64 बिट सिस्टम पर, मैंने पाया है .exe.config को SysWOW64 \ WindowsPowerhell (32 बिट फ़ोल्डर) में जाने की आवश्यकता है, भले ही आप 64 बिट पावरशेल चलाने की कोशिश कर रहे हों। अन्यथा आपको 'बाहरी रूप से परिवर्तित' त्रुटि मिलती है।
सैम

4
Powershell.exe.config जरूरतों दो स्थानों पर होने के लिए .... C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ और C: \ Windows \ SysWOW64 \ WindowsPowerShell \ v1.0 \
Jonesome को फिर से बहाल मोनिका

28

कृपया रजिस्ट्री कुंजी दृष्टिकोण का उपयोग करने के साथ बहुत सावधान रहें। ये मशीन-वाइड की हैं और .NET 4.0 पर सभी एप्लिकेशन को जबरन माइग्रेट करते हैं ।

कई उत्पाद काम नहीं करते हैं यदि जबरन माइग्रेट किया गया है और यह एक परीक्षण सहायता है और उत्पादन गुणवत्ता तंत्र नहीं है। विजुअल स्टूडियो 2008 और 2010, MSBuild , टर्बोटैक्स, और वेबसाइटों की एक होस्ट, SharePoint और इतने पर स्वचालित नहीं होना चाहिए।

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


रजिस्ट्री कुंजी का उपयोग करने के बारे में बहुत अच्छा बिंदु। खुशी से, कॉन्फ़िगर फ़ाइल के साथ लॉन्चर एप्लिकेशन ठीक काम कर रहा है। हमारी स्क्रिप्ट मुख्य रूप से फ़ाइल सिस्टम कमांड और डायरेक्ट .NET कॉल का उपयोग करती है, और हमने टूटी हुई कमांड के साथ कोई समस्या नहीं देखी है। चूंकि .NET 4 .NET 2.0 के साथ काफी हद तक पिछड़ा हुआ है, मुझे नहीं लगता कि यह संभावना है कि कई टूटे हुए कमांड होंगे (हालांकि यह सावधानी बरतने के लिए कभी दर्द नहीं करता है :)।
सम्राट XLII

26

यदि आपको केवल .NET 4 में किसी एक कमांड, स्क्रिप्ट ब्लॉक या स्क्रिप्ट फ़ाइल को निष्पादित करने की आवश्यकता है, तो CLR के संस्करण 4 का उपयोग करके PowerShell का केवल एक उदाहरण शुरू करने के लिए .NET 4 से सक्रियण कॉन्फ़िगरेशन फ़ाइलों का उपयोग करने का प्रयास करें ।

पूरा ब्योरा:

http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/

एक उदाहरण PowerShell मॉड्यूल:

https://gist.github.com/882528


21

यदि आप अभी भी PowerShell v1.0 या v2.0 पर अटके हैं, तो यहां जेसन स्टैंगरोम के उत्कृष्ट उत्तर पर मेरी भिन्नता है।

powershell4.cmdनिम्नलिखित सामग्री के साथ अपने रास्ते पर कहीं बनाएँ :

@echo off
:: http://stackoverflow.com/questions/7308586/using-batch-echo-with-special-characters
if exist %~dp0powershell.exe.activation_config goto :run
echo.^<?xml version="1.0" encoding="utf-8" ?^>                 > %~dp0powershell.exe.activation_config
echo.^<configuration^>                                        >> %~dp0powershell.exe.activation_config
echo.  ^<startup useLegacyV2RuntimeActivationPolicy="true"^>  >> %~dp0powershell.exe.activation_config
echo.    ^<supportedRuntime version="v4.0"/^>                 >> %~dp0powershell.exe.activation_config
echo.  ^</startup^>                                           >> %~dp0powershell.exe.activation_config
echo.^</configuration^>                                       >> %~dp0powershell.exe.activation_config
:run
:: point COMPLUS_ApplicationMigrationRuntimeActivationConfigPath to the directory that this cmd file lives in
:: and the directory contains a powershell.exe.activation_config file which matches the executable name powershell.exe
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=%~dp0
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe %*
set COMPLUS_ApplicationMigrationRuntimeActivationConfigPath=

यह आपको .NET 4.0 के अंतर्गत चलने वाले पावरशेल कंसोल का एक उदाहरण लॉन्च करने की अनुमति देगा।

आप अपने सिस्टम पर अंतर देख सकते हैं, जहां मैंने cmd से चलने वाले निम्न दो कमांड के आउटपुट की जांच करके PowerShell 2.0 है।

C:\>powershell -ExecutionPolicy ByPass -Command $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5485
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1


C:\>powershell4.cmd -ExecutionPolicy ByPass -Command $PSVersionTable

Name                           Value
----                           -----
PSVersion                      2.0
PSCompatibleVersions           {1.0, 2.0}
BuildVersion                   6.1.7601.17514
CLRVersion                     4.0.30319.18408
WSManStackVersion              2.0
PSRemotingProtocolVersion      2.1
SerializationVersion           1.1.0.1

3
यह अब तक का सबसे अच्छा जवाब है क्योंकि यह एक बहुत ही स्थानीय परिवर्तन है और सिस्टम में कोई भी लगातार बदलाव नहीं करता है। अच्छी चीज़!
सेबस्टियन

बहुत खुबस! क्या आप यहाँ पर मदद कर सकते हैं? stackoverflow.com/questions/39801315/…
जॉनी क्यों

@TimLewis, क्या एक ही ps4.cmd उदाहरण के लिए कई कथन भेजना संभव है?
जॉनी क्यों

@johnywhy, .cmd को कई स्टेटमेंट भेजना .exe के लिए कई स्टेटमेंट भेजने के समान है क्योंकि .cmd .exe के माध्यम से अपने सभी मापदंडों को पास करने के लिए% * का उपयोग करता है। हालांकि इससे आपको कोई फर्क नहीं पड़ता है क्योंकि आपको अभी भी सावधान रहना होगा कि कैसे cmd.exe कमांड लाइन को पार्स करता है जब यह पैरामीटर को निष्पादन योग्य में लॉन्च कर रहा है। मैं आपके अन्य स्टैक-ओवरफ़्लो प्रश्न और पते की बारीकियों पर एक नज़र डालूँगा।
टिम लुईस

मैंने इस तकनीक का उपयोग करने की कोशिश की -वर्जन कमांड लाइन पैरामीटर docs.microsoft.com/en-us/powershell/scripting/core-powershell/… अफसोस की बात है कि यह काम नहीं करता है; PowerShell का मेरा नवीनतम संस्करण (5.1.17134.407), जैसा कि $ PSVersionTable.PSVersion से निर्धारित किया गया है, इसके बजाय लॉन्च किया गया है।
eisenpony

17

यहाँ विन्यास फाइल की सामग्री है जो मैं .NET 2.0 और .NET 4 विधानसभाओं दोनों का समर्थन करता था:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- http://msdn.microsoft.com/en-us/library/w4atty68.aspx -->
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" />
    <supportedRuntime version="v2.0.50727" />
  </startup>
</configuration>

इसके अलावा, यहां PowerShell 1.0 संगत कोड का एक सरलीकृत संस्करण है जिसे मैं कमांड लाइन तर्क में पारित होने से हमारी स्क्रिप्ट निष्पादित करने के लिए उपयोग करता हूं:

class Program {
  static void Main( string[] args ) {
    Console.WriteLine( ".NET " + Environment.Version );

    string script = "& " + string.Join( " ", args );
    Console.WriteLine( script );
    Console.WriteLine( );

    // Simple host that sends output to System.Console
    PSHost host = new ConsoleHost( this );
    Runspace runspace = RunspaceFactory.CreateRunspace( host );

    Pipeline pipeline = runspace.CreatePipeline( );
    pipeline.Commands.AddScript( script );

    try {
      runspace.Open( );
      IEnumerable<PSObject> output = pipeline.Invoke( );
      runspace.Close( );

      // ...
    }
    catch( RuntimeException ex ) {
      string psLine = ex.ErrorRecord.InvocationInfo.PositionMessage;
      Console.WriteLine( "error : {0}: {1}{2}", ex.GetType( ), ex.Message, psLine );
      ExitCode = -1;
    }
  }
}

ऊपर दिखाए गए मूल त्रुटि हैंडलिंग के अलावा, हम trapअतिरिक्त नैदानिक ​​जानकारी प्रदर्शित करने के लिए स्क्रिप्ट में एक बयान भी इंजेक्ट करते हैं (जेफरी स्नोवर के संकल्प-त्रुटि फ़ंक्शन के समान)।


10

अन्य उत्तर 2012 से पहले के हैं, और वे .NET फ्रेमवर्क और कॉमन लैंग्वेज रनटाइम (सीएलआर) के नए संस्करणों को लक्षित करने में "हैकिंग" पावरशेल 1.0 या पावरशेल 2.0 पर ध्यान केंद्रित करते हैं।

हालांकि, जैसा कि कई टिप्पणियों में लिखा गया है, 2012 के बाद से (जब पावरशेल 3.0 आया) पावरशेल के नवीनतम संस्करण को स्थापित करने के लिए एक बेहतर समाधान है । यह स्वचालित रूप से सीएलआर को लक्षित करेगा v4.0.30319। इसका मतलब .NET 4.0, 4.5, 4.5.1, 4.5.2, या 4.6 (2015 में अपेक्षित) क्योंकि ये सभी संस्करण एक-दूसरे के इन-प्लेस प्रतिस्थापन हैं। यदि आप अपने PowerShell संस्करण के अनिश्चित हैं, तो PowerShell संस्करण थ्रेड निर्धारित करें का उपयोग करें $PSVersionTableया देखें ।

लेखन के समय, PowerShell का नवीनतम संस्करण 4.0 है, और इसे विंडोज मैनेजमेंट फ्रेमवर्क (Google खोज लिंक) के साथ डाउनलोड किया जा सकता है ।


2
विंडोज मैनेजमेंट फ्रेमवर्क 4.0 (वे 3.0 के लिए समान हैं) के लिए सिस्टम आवश्यकताएं हैं: विंडोज 7, विंडोज एंबेडेड स्टैंडर्ड 7, विंडोज सर्वर 2008 आर 2, विंडोज सर्वर 2012।
पीटर मोर्टेनसेन

9

वास्तव में, आप .NET .NET का उपयोग करके अन्य .NET अनुप्रयोगों को प्रभावित किए बिना चलाने के लिए PowerShell प्राप्त कर सकते हैं । नए HttpWebRequest "Host" प्रॉपर्टी का उपयोग करने के लिए मुझे ऐसा करने की आवश्यकता थी, हालांकि "OnlyUseLatestCLR" को बदलने से Fiddler टूट गया क्योंकि इसका उपयोग .NET 4 के तहत नहीं किया जा सकता था।

PowerShell के डेवलपर्स ने स्पष्ट रूप से ऐसा होने का संकेत दिया, और उन्होंने यह निर्दिष्ट करने के लिए एक रजिस्ट्री कुंजी जोड़ी कि फ्रेमवर्क के किस संस्करण का उपयोग करना चाहिए। एक मामूली समस्या यह है कि आपको इसे बदलने से पहले रजिस्ट्री कुंजी का स्वामित्व लेने की आवश्यकता है, क्योंकि यहां तक ​​कि प्रशासकों तक पहुंच नहीं है।

  • HKLM: \ Software \ Microsoft \ Powershell \ 1 \ PowerShellEngine \ RuntimeVersion (64 बिट और 32%)
  • HKLM: \ Software \ Wow6432Node \ Microsoft \ Powershell \ 1 \ PowerShellEngine \ RuntimeVersion (64 बिट मशीन पर 32 बिट)

उस कुंजी का मान आवश्यक संस्करण में बदलें। ध्यान रखें कि कुछ स्नैप अब लोड नहीं हो सकते हैं जब तक कि वे .NET 4 संगत नहीं हैं (WASP केवल एक ही है जिसके साथ मुझे परेशानी हुई है, लेकिन मैं वास्तव में वैसे भी इसका उपयोग नहीं करता हूं)। VMWare , SQL Server 2008 , PSCX, सक्रिय निर्देशिका (Microsoft और क्वेस्ट सॉफ़्टवेयर ) और SCOM सभी ठीक काम करते हैं।


+1 यह अन्य reg प्रविष्टि की तुलना में एक बहुत ही महत्वपूर्ण विकल्प (और बेहतर) है जो सभी .net अनुप्रयोगों को प्रभावित करेगा, लेकिन यह समाधान केवल पावरशेल को प्रभावित करता है।
क्रिश्चियन मिकेल्सन

"OnlyUseLatestCLR" को लागू करने के बाद मेरा फ़िडलर टूट गया और साथ ही कुछ पॉवरशेल स्क्रिप्ट्स भी नहीं चल पायीं क्योंकि कुछ सर्वर से संपर्क नहीं हो पाने के कारण। मैंने regedt32 में मैन्युअल रूप से मानों को वापस 0 में बदल दिया, और अब फिर से काम कर रहा है। धन्यवाद!
नेविल

WASP, PSCX और SCOM (इस संदर्भ में) क्या हैं?
पीटर मोर्टेंसन

7

यदि आप रजिस्ट्री या app.config फ़ाइलों को संशोधित नहीं करना चाहते हैं, तो एक वैकल्पिक तरीका एक साधारण .NET 4 कंसोल ऐप बनाना है जो PowerShell.exe करता है और PowerShell कंसोल को होस्ट करता है।

विकल्प 2 देखें - स्वयं को Windows PowerShell होस्ट करना

सबसे पहले, System.Management.Automation और Microsoft.PowerShell.ConsoleHost असेंबली को एक संदर्भ में जोड़ें, जो % programfiles% \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0 के तहत पाया जा सकता है

फिर निम्नलिखित कोड का उपयोग करें:

using System;
using System.Management.Automation.Runspaces;
using Microsoft.PowerShell;

namespace PSHostCLRv4
{
    class Program
    {
        static int Main(string[] args)
        {
            var config = RunspaceConfiguration.Create();
                return ConsoleShell.Start(
                config,
                "Windows PowerShell - Hosted on CLR v4\nCopyright (C) 2010 Microsoft Corporation. All rights reserved.",
                "",
                args
            );
        }
    }
}

6

बस एक अन्य विकल्प के रूप में, नवीनतम पॉशकोन्सोल रिलीज़ में बिना किसी कॉन्फ़िगरेशन के .NET 4 RC (जो RTM रिलीज़ के खिलाफ ठीक काम करता है) के लिए लक्षित बायनेरी शामिल हैं ।


1

COMPLUS_versionपर्यावरण चर के साथ सेट powerhell.exe चलाएँ v4.0.30319। उदाहरण के लिए, cmd.exe या .bat-file से:

set COMPLUS_version=v4.0.30319
powershell -file c:\scripts\test.ps1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.