Ich aktualisiere ein PowerShell-Skript, das einige .NET-Assemblys verwaltet. Das Skript wurde für Assemblys geschrieben, die für .NET 2 erstellt wurden (dieselbe Version des Frameworks, mit dem PowerShell ausgeführt wird), muss jetzt jedoch sowohl mit .NET 4-Assemblys als auch mit .NET 2-Assemblys arbeiten.
Da .NET 4 das Ausführen von Anwendungen unterstützt, die für ältere Versionen des Frameworks erstellt wurden, scheint es die einfachste Lösung zu sein, PowerShell mit der .NET 4-Laufzeit zu starten, wenn ich es für .NET 4-Assemblys ausführen muss.
Wie kann ich PowerShell mit der .NET 4-Laufzeit ausführen?
.net
powershell
.net-4.0
Kaiser XLII
quelle
quelle
Antworten:
PowerShell (die Engine) läuft unter .NET 4.0 einwandfrei. PowerShell (der Konsolenhost und die ISE ) tun dies nicht, nur weil sie gegen ältere Versionen von .NET kompiliert wurden. Es gibt eine Registrierungseinstellung, die das systemweit geladene .NET Framework ändert , wodurch PowerShell wiederum .NET 4.0-Klassen verwenden kann:
Um nur die ISE für die Verwendung von .NET 4.0 zu aktualisieren, können Sie die Konfigurationsdatei ($ psHome \ Powershell_ise.exe.config) so ändern, dass sie einen Block wie den folgenden enthält:
Sie können .NET 4.0-Anwendungen, die PowerShell aufrufen, mithilfe der PowerShell-API (System.Management.Automation.PowerShell) erstellen. Diese Schritte helfen jedoch dabei, die sofort einsatzbereiten PowerShell-Hosts unter .NET 4.0 zum Laufen zu bringen.
Entfernen Sie die Registrierungsschlüssel, wenn Sie sie nicht mehr benötigen. Dies sind maschinenweite Schlüssel, die ALLE Anwendungen zwangsweise auf .NET 4.0 migrieren, auch Anwendungen, die .net 2 und .net 3.5 verwenden
quelle
Die beste Lösung, die ich gefunden habe, ist im Blogbeitrag Verwenden neuerer Versionen von .NET mit PowerShell . Dadurch kann Powershell.exe mit .NET 4-Assemblys ausgeführt werden.
Ändern Sie einfach (oder erstellen Sie es)
$pshome\powershell.exe.config
so, dass es Folgendes enthält:Zusätzliche, schnelle Einrichtungshinweise:
Speicherorte und Dateien sind etwas plattformabhängig. Sie erhalten jedoch einen Überblick darüber, wie die Lösung für Sie funktioniert.
cd $pshome
im Powershell-Fenster ausführen (funktioniert nicht über die DOS-Eingabeaufforderung).C:\Windows\System32\WindowsPowerShell\v1.0\
powershell.exe.config
Wenn IhrPowerShell.exe
ausgeführt wird (erstellen Sie gegebenenfalls die Konfigurationsdatei).PowerShellISE.Exe
wird, müssen Sie die zugehörige Konfigurationsdatei als erstellenPowerShellISE.Exe.config
quelle
Bitte seien Sie SEHR vorsichtig bei der Verwendung des Registrierungsschlüssel-Ansatzes. Dies sind maschinenweite Schlüssel, mit denen ALLE Anwendungen zwangsweise auf .NET 4.0 migriert werden .
Viele Produkte funktionieren nicht, wenn sie zwangsweise migriert werden. Dies ist eine Testhilfe und kein Mechanismus für die Produktionsqualität. Visual Studio 2008 und 2010, MSBuild , Turbotax und eine Vielzahl von Websites, SharePoint usw. sollten nicht automatisch migriert werden.
Wenn Sie PowerShell mit 4.0 verwenden müssen, sollte dies auf Anwendungsbasis mit einer Konfigurationsdatei erfolgen. Erkundigen Sie sich beim PowerShell-Team nach der genauen Empfehlung. Dadurch werden wahrscheinlich einige vorhandene PowerShell-Befehle beschädigt.
quelle
Wenn Sie in .NET 4 nur einen einzigen Befehl, Skriptblock oder eine einzelne Skriptdatei ausführen müssen, versuchen Sie, mithilfe von Aktivierungskonfigurationsdateien aus .NET 4 nur eine einzelne Instanz von PowerShell mit Version 4 der CLR zu starten.
Alle Einzelheiten:
http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/
Ein Beispiel für ein PowerShell-Modul:
https://gist.github.com/882528
quelle
Wenn Sie immer noch an PowerShell v1.0 oder v2.0 festhalten, finden Sie hier meine Variation der hervorragenden Antwort von Jason Stangroome.
Erstellen Sie eine Stelle
powershell4.cmd
auf Ihrem Pfad mit den folgenden Inhalten:Auf diese Weise können Sie eine Instanz der Powershell-Konsole starten, die unter .NET 4.0 ausgeführt wird.
Sie können den Unterschied auf meinem System mit PowerShell 2.0 erkennen, indem Sie die Ausgabe der folgenden zwei Befehle untersuchen, die von cmd ausgeführt werden.
quelle
Hier ist der Inhalt der Konfigurationsdatei, mit der ich sowohl .NET 2.0- als auch .NET 4-Assemblys unterstützt habe:
Außerdem ist hier eine vereinfachte Version des PowerShell 1.0-kompatiblen Codes, mit dem ich unsere Skripte aus den übergebenen Befehlszeilenargumenten ausgeführt habe:
Zusätzlich zu der oben gezeigten grundlegenden Fehlerbehandlung fügen wir eine
trap
Anweisung in das Skript ein, um zusätzliche Diagnoseinformationen anzuzeigen (ähnlich der Resolve-Error- Funktion von Jeffrey Snover ).quelle
Die anderen Antworten stammen aus der Zeit vor 2012 und konzentrieren sich darauf, PowerShell 1.0 oder PowerShell 2.0 zu "hacken", um auf neuere Versionen von .NET Framework und Common Language Runtime (CLR) abzuzielen.
Wie bereits in vielen Kommentaren erwähnt, besteht eine viel bessere Lösung seit 2012 (als PowerShell 3.0 auf den Markt kam) darin, die neueste Version von PowerShell zu installieren . Es wird automatisch auf CLR abzielen
v4.0.30319
. Dies bedeutet .NET 4.0, 4.5, 4.5.1, 4.5.2 oder 4.6 (voraussichtlich 2015), da alle diese Versionen direkt voneinander ersetzt werden. Verwenden$PSVersionTable
Sie den Thread Installierte PowerShell-Version ermitteln oder lesen Sie ihn, wenn Sie sich über Ihre PowerShell-Version nicht sicher sind.Zum Zeitpunkt des Schreibens ist die neueste Version von PowerShell 4.0 und kann mit dem Windows Management Framework (Google-Suchlink) heruntergeladen werden .
quelle
Tatsächlich können Sie PowerShell mit .NET 4 ausführen, ohne andere .NET-Anwendungen zu beeinträchtigen. Ich musste dies tun, um die neue HttpWebRequest "Host" -Eigenschaft zu verwenden, aber das Ändern der "OnlyUseLatestCLR" brach Fiddler, da dies unter .NET 4 nicht verwendet werden konnte.
Die Entwickler von PowerShell haben dies offensichtlich vorausgesehen und einen Registrierungsschlüssel hinzugefügt, um anzugeben, welche Version des Frameworks verwendet werden soll. Ein kleines Problem ist, dass Sie den Registrierungsschlüssel in Besitz nehmen müssen, bevor Sie ihn ändern können, da selbst Administratoren keinen Zugriff haben.
Ändern Sie den Wert dieses Schlüssels in die erforderliche Version. Beachten Sie jedoch, dass einige Snapins möglicherweise nicht mehr geladen werden, es sei denn, sie sind .NET 4-kompatibel (WASP ist das einzige, mit dem ich Probleme hatte, aber ich verwende es trotzdem nicht wirklich). VMWare , SQL Server 2008 , PSCX, Active Directory (Microsoft und Quest Software ) und SCOM funktionieren einwandfrei.
quelle
Wenn Sie die Registrierungs- oder app.config-Dateien nicht ändern möchten, können Sie alternativ eine einfache .NET 4-Konsolen-App erstellen, die die Funktionen von PowerShell.exe nachahmt und die PowerShell ConsoleShell hostet.
Siehe Option 2 - Hosten von Windows PowerShell selbst
Fügen Sie zunächst einen Verweis auf die Assemblys System.Management.Automation und Microsoft.PowerShell.ConsoleHost hinzu, die sich unter % programfiles% \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0 befinden
Verwenden Sie dann den folgenden Code:
quelle
Genau wie eine andere Option enthält die neueste PoshConsole- Version Binärdateien für .NET 4 RC (die gegen die RTM-Version problemlos funktionieren) ohne Konfiguration.
quelle
Führen Sie einfach Powershell.exe mit der
COMPLUS_version
Umgebungsvariablen auf ausv4.0.30319
. Zum Beispiel aus cmd.exe oder .bat-Datei:quelle