237 votes

Comment puis-je lancer PowerShell avec le .NET 4 runtime?

Je me suis mise à jour d'un script PowerShell qui gère certains .NET assemblées. Le script a été écrit pour les assemblées construit contre la .NET 2 (la même version de la cadre que PowerShell s'exécute avec), mais doit maintenant travailler avec .NET 4 assemblées ainsi que .NET 2 assemblées.

Depuis .NET 4 prend en charge l'exécution des applications construites avec d'anciennes versions de l'infrastructure, il semble que la solution la plus simple est de lancer PowerShell avec le .NET 4 runtime quand j'ai besoin de l'exécuter contre .NET 4 assemblées.

Comment puis-je lancer PowerShell avec le .NET 4 runtime?

239voto

cmo999 Points 1699

La meilleure solution que j'ai trouvé est dans le billet de blog en Utilisant une Version plus Récente(s) de .NET avec PowerShell. Cela permet powershell.exe pour fonctionner avec .NET 4 assemblées.

Il suffit de modifier (ou créer) $pshome\powershell.exe.config , de sorte qu'il contient les éléments suivants:

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

Supplémentaire, l'installation rapide de notes:

Les emplacements et les fichiers sont un peu dépendants de la plateforme; cependant vous donner un inline essentiel de la façon de faire de la solution de travail pour vous.

  • Vous pouvez trouver PowerShell de l'emplacement sur votre ordinateur en exécutant cd $pshome dans la fenêtre Powershell (ne fonctionne pas à partir de l'invite de commandes DOS).
    • Le chemin sera quelque chose comme (par exemple) C:\Windows\System32\WindowsPowerShell\v1.0\
  • Le nom de fichier à mettre dans la configuration est: powershell.exe.config si vos PowerShell.exe est en cours d'exécution (créer le fichier de configuration si besoin).
    • Si PowerShellISE.Exe est en cours d'exécution, puis vous avez besoin pour créer son compagnon le fichier de configuration comme l' PowerShellISE.Exe.config

147voto

Start-Automating Points 3953

PowerShell (le moteur) fonctionne très bien sous .NET 4.0. PowerShell ( la console de l'hôte et de l'ISE) ne le font pas, tout simplement parce qu'ils ont été compilées avec des versions plus anciennes de .NET. Il y a un paramètre de registre qui va changer les .NET framework chargé à l'échelle du système, qui permettra à son tour PowerShell à utiliser .NET 4.0 classes:

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

Pour la mise à jour de l'ISE à utiliser .NET 4.0, vous pouvez modifier le fichier de configuration (psHome $\powershell_ise.exe.config) fichier pour avoir un morceau comme ceci:

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

Vous pouvez construire .NET 4.0 applications qui appellent PowerShell en utilisant le PowerShell (API Système.De la gestion.L'automatisation.PowerShell), mais ces étapes vous aidera à faire le dans-la-boîte de PowerShell hôtes à travailler .NET 4.0

Espérons que cette aide

28voto

Madhu Talluri Points 269

S'il vous plaît être TRÈS prudent avec l'aide de la clé de registre approche. Ce sont des machine-clés et forcibily migrer TOUTES les applications .NET 4.0.

De nombreux produits ne fonctionnent pas si forcibily migré et c'est un essai de l'aide et non pas une qualité de la production mécanisme. Visual Studio 2008 et 2010, MSBuild, impôtrapide, et une foule de sites web, SharePoint et ainsi de suite ne devrait pas être automigrated.

Si vous avez besoin d'utiliser PowerShell avec 4.0, cela devrait être fait sur chaque application avec un fichier de configuration, vous devriez vérifier avec le PowerShell de l'équipe sur la précision de la recommandation. C'est le risque de rupture des commandes PowerShell.

26voto

Jason Stangroome Points 2264

Si vous n'avez pas besoin d'exécuter une seule commande, bloc de script, ou fichier de script .NET 4, essayez d'utiliser l'Activation des Fichiers de Configuration .NET 4 pour lancer qu'une seule instance de PowerShell à l'aide de la version 4 de la CLR:

http://msdn.microsoft.com/en-us/library/ff361644.aspx

Plus de détails:

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

Un exemple de module PowerShell:

https://gist.github.com/882528

17voto

Emperor XLII Points 5493

Voici le contenu du fichier de configuration que j'ai utilisé pour soutenir à la fois .NET 2.0 et .NET 4 assemblées:

<?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>

Aussi, voici une version simplifiée de l'PowerShell 1.0 compatible code que j'ai utilisé pour l'exécution de nos scripts de le passé dans les arguments de ligne de commande:

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

En plus de la gestion des erreurs de base indiqué ci-dessus, nous avons également injecter une trap énoncé dans le script pour afficher d'autres informations de diagnostic (similaire à Jeffrey snover fait de Résoudre l'Erreur de la fonction).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X