Jak mogę uruchomić PowerShell z the.NET 4 runtime?

Aktualizuję skrypt PowerShell, który zarządza niektórymi złożeniami. NET. Skrypt został napisany dla zestawów zbudowanych na bazie. NET 2 (tej samej wersji frameworka, z którą działa PowerShell), ale teraz musi pracować zarówno z zestawami. NET 4, jak i. Net 2.

Ponieważ. NET 4 obsługuje uruchamianie aplikacji zbudowanych na starszych wersjach frameworka, wydaje się, że najprostszym rozwiązaniem jest uruchomienie PowerShell z. Net 4 runtime, gdy muszę go uruchomić na. Net 4 / align = "left" /

Jak mogę uruchomić PowerShell z. Net 4 runtime?

Author: Anthony Mastrean, 2010-01-19

10 answers

PowerShell (silnik) działa dobrze pod. NET 4.0. PowerShell (host konsoli i ISE) nie działają, po prostu dlatego, że zostały skompilowane ze starszymi wersjami .NET. istnieje ustawienie rejestru, które zmieni załadowany system. NET Framework, co z kolei pozwoli Powershellowi korzystać z klas. 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

Aby zaktualizować tylko ISE, aby używać. NET 4.0, możesz zmienić konfigurację ($pshome\powershell_ise.exe.config) plik ma mieć taki fragment jak to:

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

Możesz tworzyć aplikacje. NET 4.0, które wywołują PowerShell przy użyciu PowerShell API (System.Zarządzanie.Automatyka.PowerShell) po prostu dobrze, ale te kroki pomogą uzyskać wbudowane hosty PowerShell do pracy pod. NET 4.0.


Usuń klucze rejestru, gdy nie są już potrzebne. Są to klucze maszynowe i wymuszają migrację wszystkich aplikacji do. NET 4.0, nawet aplikacji korzystających z. Net 2 i. Net 3.5


 144
Author: Start-Automating,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-10 15:40:59

Najlepsze rozwiązanie znalazłem w blogu korzystanie z nowszych wersji. NET z PowerShell. Umożliwia to powershell.exe do uruchomienia z. Net 4 assemblies.

Po prostu zmodyfikuj (lub utwórz) $pshome\powershell.exe.config tak, aby zawierał:

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

Dodatkowe, szybkie uwagi dotyczące konfiguracji:

lokalizacje i pliki są w pewnym stopniu zależne od platformy; jednak da ci wbudowany gist, jak sprawić, by rozwiązanie działało dla Ciebie.

  • Ty może znaleźć lokalizację PowerShell na komputerze, wykonując cd $pshome w oknie Powershell (nie działa z polecenia DOS).
    • ścieżka będzie czymś w rodzaju (przykład) C:\Windows\System32\WindowsPowerShell\v1.0\
  • nazwa pliku do umieszczenia konfiguracji to: powershell.exe.config Jeśli twój PowerShell.exe jest wykonywany (Utwórz plik konfiguracyjny, jeśli zajdzie taka potrzeba).
    • Jeśli PowerShellISE.Exe jest uruchomiony, musisz utworzyć plik konfiguracyjny jako PowerShellISE.Exe.config
 229
Author: cmo999,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 18:29:49

Należy zachować szczególną ostrożność przy użyciu klucza rejestru. Są to klucze maszynowe i wymuszają migrację wszystkich aplikacji do . NET 4.0.

Wiele produktów nie działa w przypadku przymusowej migracji i jest to pomoc w testowaniu, a nie Mechanizm jakości produkcji. Visual Studio 2008 i 2010, MSBuild, turbotax, a także wiele stron internetowych, SharePoint itd. nie powinno być automatyzowane.

Jeśli potrzebujesz użyć PowerShell z 4.0, powinno to być zrobione na w zależności od aplikacji z plikiem konfiguracyjnym, należy sprawdzić w zespole PowerShell dokładną rekomendację. Może to spowodować złamanie niektórych istniejących poleceń PowerShell.

 28
Author: Madhu Talluri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 10:30:46

Jeśli musisz wykonać tylko jedno polecenie, blok skryptu lub plik skryptu w.Net 4, spróbuj użyć plików konfiguracyjnych aktywacji Z. NET 4, aby uruchomić tylko jedną instancję PowerShell przy użyciu wersji 4 CLR.

Pełne szczegóły:

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

Przykładowy moduł PowerShell:

Https://gist.github.com/882528

 26
Author: Jason Stangroome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 18:26:23

Oto zawartość pliku konfiguracyjnego, którego użyłem do obsługi zestawów. NET 2.0 i. 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>

Oto również uproszczona wersja kodu zgodnego z PowerShell 1.0, którego użyłem do wykonywania naszych skryptów z podanych w wierszu poleceń argumentów:

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;
    }
  }
}

Oprócz podstawowej obsługi błędów pokazanej powyżej, Wprowadzamy również do skryptu instrukcję trap, aby wyświetlić dodatkowe informacje diagnostyczne (podobne do Resolve-Error funkcja).

 16
Author: Emperor XLII,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 15:32:53

Jeśli nadal utknąłeś na PowerShell v1. 0 lub v2. 0, oto moja wariacja na temat doskonałej odpowiedzi Jasona Stangroome ' a.

Utwórz powershell4.cmd gdzieś na swojej ścieżce o następującej treści:

@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=

Umożliwi to uruchomienie instancji konsoli powershell działającej pod. NET 4.0.

Możesz zobaczyć różnicę w moim systemie, gdzie mam PowerShell 2.0, badając wyjście następujących dwóch komend uruchamianych z cmd.

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
 16
Author: Tim Lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-07 21:18:54

Inne odpowiedzi pochodzą sprzed 2012 roku i koncentrują się na "hakowaniu" PowerShell 1.0 lub PowerShell 2.0 do kierowania nowszych wersji.NET Framework i Common Language Runtime (CLR).

Jednak, jak pisano w wielu komentarzach, od 2012 roku (kiedy pojawił się PowerShell 3.0) znacznie lepszym rozwiązaniem jest Zainstaluj najnowszą wersję PowerShell. To automatycznie cel CLR v4.0.30319. Oznacza to. net 4.0, 4.5, 4.5.1, 4.5.2 lub 4.6 (spodziewane w 2015), ponieważ wszystkie te wersje są zamiennikami siebie nawzajem. Użyj $PSVersionTable lub zobacz Wybierz zainstalowaną wersję PowerShell wątek jeśli nie masz pewności co do wersji PowerShell.

W chwili pisania tego tekstu najnowsza wersja PowerShell To 4.0 i może być pobrana za pomocą frameworka zarządzania Windows (google search link) .
 10
Author: Jeppe Stig Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:17

W rzeczywistości możesz uruchomić PowerShell używając. NET 4 bez wpływu na inne aplikacje. NET. Musiałem to zrobić, aby użyć nowej właściwości HttpWebRequest "Host" , jednak zmiana "OnlyUseLatestCLR" złamała Fiddlera, ponieważ nie można go używać pod. NET 4.

Twórcy PowerShell oczywiście przewidzieli to i dodali klucz rejestru, aby określić, jakiej wersji frameworka powinien używać. Drobnym problemem jest to, że musisz wziąć na własność klucz rejestru przed jego zmianą, ponieważ nawet administratorzy nie mają dostępu.

  • HKLM: \ Software \ Microsoft \ Powershell\1 \ PowerShellEngine \ RuntimeVersion (64 bit i 32 bit)
  • HKLM: \ Software\Wow6432Node\Microsoft \ Powershell\1 \ PowerShellEngine \ RuntimeVersion (32-bitowa NA 64-bitowej maszynie)

Zmień wartość tego klucza na wymaganą wersję. Pamiętaj jednak, że niektóre snapiny mogą już się nie ładować, chyba że są kompatybilne z. Net 4 (OSA jest jedynym, który miałem problem z, ale i tak go nie używam). VMWare, SQL Server 2008, PSCX, Active Directory (Microsoft i Quest Software ) i SCOM działają poprawnie.

 8
Author: Justin Yancey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 18:27:03

Jeśli nie chcesz modyfikować rejestru lub aplikacji.pliki konfiguracyjne, alternatywnym sposobem jest stworzenie prostej aplikacji konsoli. NET 4, która naśladuje PowerShell.exe robi i hostuje konsolę PowerShell.

Zobacz {[4–} Opcja 2-Hosting Windows PowerShell

Najpierw dodaj odniesienie do systemu .Zarządzanie.Automatyzacja i Microsoft.PowerShell.Consolehost assemblies, które można znaleźć pod % programfiles % \Reference Assemblies\Microsoft\WindowsPowerShell \ v1.0

Następnie użyj następującego kodu:

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
            );
        }
    }
}
 7
Author: Grant Holliday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 18:42:51

Tak jak inna opcja, Najnowsze wydanie PoshConsole zawiera pliki binarne skierowane do . NET 4 RC (które działają dobrze przeciwko wydaniu RTM) bez żadnej konfiguracji.

 6
Author: Jaykul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 10:29:18