.net - मैं .NET 4 रनटाइम के साथ PowerShell कैसे चला सकता हूं?




5 Answers

पावरशेल (इंजन) .NET 4.0 के तहत ठीक चलाता है। पावरशेल (कंसोल होस्ट और ISE ) नहीं, सिर्फ इसलिए कि वे .NET के पुराने संस्करणों के खिलाफ संकलित किए गए थे। एक रजिस्ट्री सेटिंग है जो .NET Framework को सिस्टमव्यापी लोड कर देगी, जो बदले में 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 का उपयोग करने के लिए केवल आईएसई को अपडेट करने के लिए, आप कॉन्फ़िगरेशन ($ psHome \ powershell_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 को ठीक कहें, लेकिन ये चरण इन-द-बॉक्स PowerShell होस्ट को .NET 4.0 के अंतर्गत काम करने में मदद करेंगे।

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

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

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

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




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

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

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




कॉन्फ़िगरेशन फ़ाइल की सामग्री यहां दी गई है जिसका उपयोग मैं .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;
    }
  }
}

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




अन्य उत्तर 2012 से पहले हैं, और वे .NET Framework और Common Language Runtime (CLR) के नए संस्करणों को लक्षित करने के लिए "हैकिंग" PowerShell 1.0 या PowerShell 2.0 पर ध्यान केंद्रित करते हैं।

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

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




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

विकल्प 2 देखें - होस्टिंग विंडोज पावरशेल स्वयं

सबसे पहले, System.Management.Automation और Microsoft.PowerShell.ConsoleHost असेंबली का संदर्भ जोड़ें जो % programfiles% \ संदर्भ असेंबली \ 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
            );
        }
    }
}



Related