Aktualizuję skrypt PowerShell, który zarządza niektórymi zestawami .NET. Skrypt został napisany dla zestawów zbudowanych w oparciu o .NET 2 (ta sama wersja frameworku, z którym działa PowerShell), ale teraz musi współpracować z zestawami .NET 4, jak również z zestawami .NET 2.
Ponieważ .NET 4 obsługuje uruchomione aplikacje zbudowane na starszych wersjach frameworka, wydaje się, że najprostszym rozwiązaniem jest uruchomienie PowerShell z środowiskiem uruchomieniowym .NET 4, kiedy muszę uruchomić go na zestawach .NET 4.
Jak mogę uruchomić PowerShell z środowiskiem uruchomieniowym .NET 4?
.net
powershell
.net-4.0
Cesarz XLII
źródło
źródło
Odpowiedzi:
PowerShell (silnik) działa dobrze w .NET 4.0. PowerShell (host konsoli i ISE ) nie, po prostu dlatego, że zostały skompilowane ze starszymi wersjami .NET. Istnieje ustawienie rejestru, które zmieni platformę .NET ładowaną ogólnosystemowo , co z kolei pozwoli PowerShellowi na użycie klas .NET 4.0:
Aby zaktualizować tylko ISE do korzystania z .NET 4.0, możesz zmienić plik konfiguracyjny ($ psHome \ powershell_ise.exe.config), aby mieć taki fragment:
Możesz budować aplikacje .NET 4.0, które wywołują PowerShell przy użyciu API PowerShell (System.Management.Automation.PowerShell), ale te kroki pomogą w uruchomieniu gotowych hostów PowerShell w .NET 4.0.
Usuń klucze rejestru, gdy już ich nie potrzebujesz. Są to klucze dla całej maszyny i wymuszają migrację WSZYSTKICH aplikacji do .NET 4.0, nawet aplikacji używających .net 2 i .net 3.5
źródło
Najlepsze rozwiązanie, jakie znalazłem, znajduje się w poście na blogu Korzystanie z nowszych wersji platformy .NET z programem PowerShell . Dzięki temu powershell.exe może działać z zestawami .NET 4.
Po prostu zmodyfikuj (lub utwórz),
$pshome\powershell.exe.config
aby zawierał następujące elementy:Dodatkowe uwagi na temat szybkiej konfiguracji:
Lokalizacje i pliki są nieco zależne od platformy; da ci jednak ogólny zarys tego, jak sprawić, by rozwiązanie działało dla Ciebie.
cd $pshome
w oknie PowerShell (nie działa z wiersza poleceń DOS).C:\Windows\System32\WindowsPowerShell\v1.0\
powershell.exe.config
jeśliPowerShell.exe
jest wykonywany (w razie potrzeby utwórz plik konfiguracyjny).PowerShellISE.Exe
jest uruchomiony, musisz utworzyć jego towarzyszący plik konfiguracyjny jakoPowerShellISE.Exe.config
źródło
Należy BARDZO ostrożnie stosować metodę klucza rejestru. Są to klucze dla całej maszyny i wymuszają migrację WSZYSTKICH aplikacji do .NET 4.0.
Wiele produktów nie działa w przypadku przymusowej migracji, co jest pomocą testową, a nie mechanizmem jakości produkcji. Visual Studio 2008 i 2010, MSBuild , turbotax oraz wiele stron internetowych, SharePoint i tak dalej nie powinny być migrowane automatycznie.
Jeśli chcesz używać programu PowerShell z wersją 4.0, należy to zrobić dla każdej aplikacji za pomocą pliku konfiguracyjnego, należy to sprawdzić w zespole programu PowerShell w sprawie dokładnych zaleceń. Może to spowodować uszkodzenie niektórych istniejących poleceń PowerShell.
źródło
Jeśli musisz wykonać tylko jedno polecenie, blok skryptu lub plik skryptu w .NET 4, spróbuj użyć plików konfiguracji aktywacji z .NET 4, aby uruchomić tylko jedno wystąpienie programu PowerShell przy użyciu wersji 4 CLR.
Pełne szczegóły:
http://blog.codeassassin.com/2011/03/23/executing-indidual-powershell-commands-using-net-4/
Przykładowy moduł PowerShell:
https://gist.github.com/882528
źródło
Jeśli nadal tkwisz w programie PowerShell v1.0 lub v2.0, oto moja odmiana doskonałej odpowiedzi Jasona Stangroome'a.
Utwórz
powershell4.cmd
gdzieś na swojej ścieżce z następującą zawartością:Umożliwi to uruchomienie instancji konsoli PowerShell działającej pod .NET 4.0.
Możesz zobaczyć różnicę w moim systemie, w którym mam PowerShell 2.0, sprawdzając dane wyjściowe następujących dwóch poleceń uruchamianych z cmd.
źródło
Oto zawartość pliku konfiguracyjnego, którego użyłem do obsługi zarówno zespołów .NET 2.0, jak i .NET 4:
Ponadto, oto uproszczona wersja kodu kompatybilnego z PowerShell 1.0, którego użyłem do wykonania naszych skryptów z przekazanych argumentów wiersza poleceń:
Oprócz podstawowej obsługi błędów pokazanej powyżej, wstrzykujemy również
trap
skrypt do skryptu, aby wyświetlić dodatkowe informacje diagnostyczne (podobne do funkcji błędu rozwiązania Jeffreya Snovera ).źródło
Inne odpowiedzi pochodzą sprzed 2012 roku i koncentrują się na „hakowaniu” programu PowerShell 1.0 lub PowerShell 2.0 w celu atakowania nowszych wersji programu .NET Framework i Common Language Runtime (CLR).
Jednak, jak napisano w wielu komentarzach, od 2012 r. (Kiedy pojawiła się PowerShell 3.0) znacznie lepszym rozwiązaniem jest zainstalowanie najnowszej wersji PowerShell . Będzie automatycznie celować w CLR
v4.0.30319
. Oznacza to .NET 4.0, 4.5, 4.5.1, 4.5.2 lub 4.6 (oczekiwany w 2015 r.), Ponieważ wszystkie te wersje zastępują się nawzajem. Użyj$PSVersionTable
lub zobacz Określenie zainstalowanego wątku wersji PowerShell jeśli nie jesteś pewien swojej wersji PowerShell.W chwili pisania tego tekstu najnowszą wersją programu PowerShell jest 4.0 i można ją pobrać za pomocą Windows Management Framework (link wyszukiwania Google) .
źródło
W rzeczywistości można uruchomić PowerShell przy użyciu .NET 4 bez wpływu na inne aplikacje .NET. Musiałem to zrobić, aby użyć nowej właściwości „Host” HttpWebRequest, jednak zmiana „OnlyUseLatestCLR” spowodowała uszkodzenie Fiddlera, ponieważ nie można jej było używać w .NET 4.
Programiści PowerShell oczywiście przewidzieli, że tak się stanie, i dodali klucz rejestru, aby określić, jakiej wersji środowiska powinien używać. Jednym drobnym problemem jest to, że musisz przejąć na własność klucz rejestru przed jego zmianą, ponieważ nawet administratorzy nie mają dostępu.
Zmień wartość tego klucza na wymaganą wersję. Pamiętaj jednak, że niektóre przystawki mogą się nie ładować, chyba że są zgodne z platformą .NET 4 (tylko z WASP miałem problemy, ale i tak z niego nie korzystam). VMWare , SQL Server 2008 , PSCX, Active Directory (Microsoft i Quest Software ) oraz SCOM działają dobrze.
źródło
Jeśli nie chcesz modyfikować plików rejestru lub app.config, alternatywnym sposobem jest utworzenie prostej aplikacji konsoli .NET 4, która naśladuje działanie programu PowerShell.exe i obsługuje konsolę PowerShell.
Zobacz opcję 2 - samodzielne hostowanie środowiska Windows PowerShell
Najpierw dodaj odwołanie do zestawów System.Management.Automation i Microsoft.PowerShell.ConsoleHost, które można znaleźć w folderze% programfiles% \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0
Następnie użyj następującego kodu:
źródło
Jako kolejna opcja, najnowsza wersja PoshConsole zawiera pliki binarne ukierunkowane na .NET 4 RC (które działają dobrze w stosunku do wersji RTM) bez żadnej konfiguracji.
źródło
Wystarczy uruchomić powershell.exe ze
COMPLUS_version
zmienną środowiskową ustawioną nav4.0.30319
. Na przykład z pliku cmd.exe lub pliku bat:źródło