Saya memperbarui skrip PowerShell yang mengelola beberapa rakitan .NET. Script ditulis untuk majelis yang dibangun melawan .NET 2 (versi kerangka kerja yang sama yang dijalankan PowerShell), tetapi sekarang perlu bekerja dengan .NET 4 majelis serta .NET 2 majelis.
Karena .NET 4 mendukung aplikasi yang berjalan yang dibangun melawan versi kerangka kerja yang lebih lama, sepertinya solusi paling sederhana adalah meluncurkan PowerShell dengan runtime .NET 4 ketika saya harus menjalankannya melawan .NET 4 rakitan.
Bagaimana saya bisa menjalankan PowerShell dengan runtime .NET 4?
.net
powershell
.net-4.0
Kaisar XLII
sumber
sumber
Jawaban:
PowerShell (engine) bekerja dengan baik di bawah .NET 4.0. PowerShell (host konsol dan ISE ) tidak, hanya karena mereka dikompilasi dengan versi .NET yang lebih lama. Ada pengaturan registri yang akan mengubah .NET dimuat kerangka sistem , yang pada gilirannya akan memungkinkan PowerShell untuk menggunakan .NET 4.0 kelas:
Untuk memperbarui hanya ISE untuk menggunakan. NET 4.0, Anda dapat mengubah file konfigurasi ($ psHome \ powershell_ise.exe.config) untuk memiliki chunk seperti ini:
Anda dapat membangun aplikasi .NET 4.0 yang memanggil PowerShell menggunakan PowerShell API (System.Management.Automation.PowerShell) baik-baik saja, tetapi langkah-langkah ini akan membantu membuat host PowerShell dalam-kotak untuk bekerja di bawah .NET 4.0.
Hapus kunci registri ketika Anda tidak membutuhkannya lagi. Ini adalah kunci di seluruh mesin dan secara paksa memigrasi SEMUA aplikasi ke .NET 4.0, bahkan aplikasi menggunakan .net 2 dan .net 3.5
sumber
Solusi terbaik yang saya temukan adalah di posting blog Menggunakan Versi yang lebih baru dari .NET dengan PowerShell . Ini memungkinkan powershell.exe dijalankan dengan .NET 4 rakitan.
Cukup modifikasi (atau buat)
$pshome\powershell.exe.config
sehingga mengandung yang berikut:Catatan pengaturan tambahan yang cepat:
Lokasi dan file agak tergantung platform; namun akan memberi Anda intisari intinya tentang bagaimana membuat solusi itu bekerja untuk Anda.
cd $pshome
di jendela Powershell (tidak berfungsi dari DOS prompt).C:\Windows\System32\WindowsPowerShell\v1.0\
powershell.exe.config
jika AndaPowerShell.exe
dieksekusi (buat file konfigurasi jika perlu).PowerShellISE.Exe
sedang berjalan maka Anda perlu membuat file konfigurasi pendampingnya sebagaiPowerShellISE.Exe.config
sumber
Harap SANGAT hati-hati dengan menggunakan pendekatan kunci registri. Ini adalah kunci di seluruh mesin dan secara otomatis memigrasi SEMUA aplikasi ke .NET 4.0.
Banyak produk tidak berfungsi jika dimigrasi secara paksa dan ini merupakan alat uji dan bukan mekanisme kualitas produksi. Visual Studio 2008 dan 2010, MSBuild , turbotax, dan sejumlah situs web, SharePoint , dan sebagainya tidak boleh diotomatisasi.
Jika Anda perlu menggunakan PowerShell dengan 4.0, ini harus dilakukan berdasarkan per-aplikasi dengan file konfigurasi, Anda harus memeriksa dengan tim PowerShell pada rekomendasi yang tepat. Ini kemungkinan akan memecah beberapa perintah PowerShell yang ada.
sumber
Jika Anda hanya perlu menjalankan satu perintah, blok skrip, atau file skrip di .NET 4, coba gunakan Aktivasi File Konfigurasi dari .NET 4 untuk memulai hanya satu contoh PowerShell menggunakan versi 4 dari CLR.
Detail lengkap:
http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/
Contoh modul PowerShell:
https://gist.github.com/882528
sumber
Jika Anda masih terjebak pada PowerShell v1.0 atau v2.0, berikut adalah variasi saya pada jawaban Jason Stangroome yang luar biasa.
Buat suatu
powershell4.cmd
tempat di jalur Anda dengan konten berikut:Ini akan memungkinkan Anda untuk meluncurkan instance dari konsol PowerShell yang berjalan di bawah .NET 4.0.
Anda dapat melihat perbedaan pada sistem saya di mana saya memiliki PowerShell 2.0 dengan memeriksa output dari dua perintah berikut dijalankan dari cmd.
sumber
Berikut adalah isi dari file konfigurasi yang saya gunakan untuk mendukung rakitan .NET 2.0 dan .NET 4:
Juga, inilah versi sederhana dari kode yang kompatibel dengan PowerShell 1.0 yang saya gunakan untuk mengeksekusi skrip kami dari argumen baris perintah yang diteruskan:
Selain penanganan kesalahan dasar yang ditunjukkan di atas, kami juga menyuntikkan
trap
pernyataan ke dalam skrip untuk menampilkan informasi diagnostik tambahan (mirip dengan fungsi Resolve-Error Jeffrey Snover ).sumber
Jawaban lain dari sebelum 2012, dan mereka fokus pada "peretasan" PowerShell 1.0 atau PowerShell 2.0 ke dalam penargetan versi yang lebih baru dari .NET Framework dan Common Language Runtime (CLR).
Namun, seperti yang telah ditulis dalam banyak komentar, sejak 2012 (ketika PowerShell 3.0 datang) solusi yang jauh lebih baik adalah menginstal versi terbaru PowerShell . Ini akan secara otomatis menargetkan CLR
v4.0.30319
. Ini berarti .NET 4.0, 4.5, 4.5.1, 4.5.2, atau 4.6 (diharapkan pada 2015) karena semua versi ini merupakan pengganti satu sama lain. Gunakan$PSVersionTable
atau lihat Tentukan utas versi PowerShell yang terinstal jika Anda tidak yakin dengan versi PowerShell Anda.Pada saat penulisan, versi terbaru PowerShell adalah 4.0, dan dapat diunduh dengan Windows Management Framework (tautan pencarian Google) .
sumber
Sebenarnya, Anda bisa menjalankan PowerShell menggunakan .NET 4 tanpa memengaruhi aplikasi .NET lainnya. Saya perlu melakukannya untuk menggunakan properti "Host" HttpWebRequest baru, namun mengubah "OnlyUseLatestCLR" memecah Fiddler karena itu tidak dapat digunakan dalam .NET 4.
Pengembang PowerShell jelas meramalkan ini terjadi, dan mereka menambahkan kunci registri untuk menentukan versi Kerangka apa yang harus digunakan. Satu masalah kecil adalah bahwa Anda perlu mengambil kepemilikan kunci registri sebelum mengubahnya, karena bahkan administrator tidak memiliki akses.
Ubah nilai kunci itu ke versi yang diperlukan. Perlu diingat bahwa beberapa snapins mungkin tidak lagi memuat kecuali mereka. NET 4 kompatibel (WASP adalah satu-satunya yang saya punya masalah dengan, tetapi saya tidak benar-benar menggunakannya). VMWare , SQL Server 2008 , PSCX, Active Directory (Microsoft dan Quest Software ) dan SCOM semuanya berfungsi dengan baik.
sumber
Jika Anda tidak ingin memodifikasi file registri atau app.config, cara alternatif adalah membuat aplikasi .NET 4 konsol sederhana yang meniru apa yang dilakukan PowerShell.exe dan meng-host PowerShell ConsoleShell.
Lihat Opsi 2 - Hosting sendiri Windows PowerShell
Pertama, tambahkan referensi ke System.Management.Automation dan Microsoft.PowerShell.ConsoleHost rakitan yang dapat ditemukan di bawah % programfiles% \ Assemblies Referensi \ Microsoft \ WindowsPowerShell \ v1.0
Kemudian gunakan kode berikut:
sumber
Sama seperti opsi lain, rilis PoshConsole terbaru termasuk binari yang ditargetkan untuk .NET 4 RC (yang berfungsi dengan baik terhadap rilis RTM) tanpa konfigurasi apa pun.
sumber
Jalankan powershell.exe dengan
COMPLUS_version
variabel lingkungan diatur kev4.0.30319
. Misalnya, dari cmd.exe atau .bat-file:sumber