Estoy actualizando un script de PowerShell que administra algunos ensamblados .NET. El script se escribió para ensamblados creados con .NET 2 (la misma versión del marco con el que se ejecuta PowerShell), pero ahora debe funcionar con ensamblados .NET 4 y ensamblados .NET 2.
Dado que .NET 4 admite la ejecución de aplicaciones creadas en versiones anteriores del marco, parece que la solución más simple es iniciar PowerShell con el tiempo de ejecución de .NET 4 cuando necesito ejecutarlo en ensamblados de .NET 4.
¿Cómo puedo ejecutar PowerShell con .NET 4 runtime?
.net
powershell
.net-4.0
Emperador XLII
fuente
fuente
Respuestas:
PowerShell (el motor) funciona bien en .NET 4.0. PowerShell (el host de la consola y el ISE ) no lo hacen, simplemente porque se compilaron con versiones anteriores de .NET. Hay una configuración de registro que cambiará el marco .NET cargado en todo el sistema , lo que a su vez permitirá que PowerShell use las clases .NET 4.0:
Para actualizar solo el ISE para usar .NET 4.0, puede cambiar el archivo de configuración ($ psHome \ powershell_ise.exe.config) para tener un fragmento como este:
Puede crear aplicaciones .NET 4.0 que llamen a PowerShell utilizando la API de PowerShell (System.Management.Automation.PowerShell) muy bien, pero estos pasos ayudarán a que los hosts PowerShell listos para usar funcionen bajo .NET 4.0.
Elimine las claves de registro cuando ya no las necesite. Estas son claves de toda la máquina y migran por la fuerza TODAS las aplicaciones a .NET 4.0, incluso las aplicaciones que usan .net 2 y .net 3.5
fuente
La mejor solución que he encontrado está en la publicación del blog Uso de versiones más recientes de .NET con PowerShell . Esto permite que powershell.exe se ejecute con ensamblados .NET 4.
Simplemente modifique (o cree)
$pshome\powershell.exe.config
para que contenga lo siguiente:Notas adicionales de configuración rápida:
Las ubicaciones y los archivos dependen de alguna manera de la plataforma; sin embargo, le dará una idea general de cómo hacer que la solución funcione para usted.
cd $pshome
en la ventana de Powershell (no funciona desde el indicador de DOS).C:\Windows\System32\WindowsPowerShell\v1.0\
powershell.exe.config
siPowerShell.exe
se está ejecutando (cree el archivo de configuración si es necesario).PowerShellISE.Exe
está ejecutando, debe crear su archivo de configuración complementario comoPowerShellISE.Exe.config
fuente
Tenga MUCHO cuidado al usar el enfoque de clave de registro. Estas son claves de toda la máquina y permiten migrar forzosamente TODAS las aplicaciones a .NET 4.0.
Muchos productos no funcionan si la migración migra por la fuerza y esto es una ayuda de prueba y no un mecanismo de calidad de producción. Visual Studio 2008 y 2010, MSBuild , turbotax y una gran cantidad de sitios web, SharePoint , etc. no deben automatizarse.
Si necesita usar PowerShell con 4.0, esto debe hacerse por aplicación con un archivo de configuración, debe consultar con el equipo de PowerShell sobre la recomendación precisa. Es probable que esto rompa algunos comandos de PowerShell existentes.
fuente
Si solo necesita ejecutar un solo comando, bloque de secuencia de comandos o archivo de secuencia de comandos en .NET 4, intente usar los archivos de configuración de activación de .NET 4 para iniciar solo una instancia única de PowerShell con la versión 4 del CLR.
Todos los detalles:
http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/
Un ejemplo de módulo PowerShell:
https://gist.github.com/882528
fuente
Si todavía está atascado en PowerShell v1.0 o v2.0, aquí está mi variación sobre la excelente respuesta de Jason Stangroome.
Crea un
powershell4.cmd
lugar en tu camino con los siguientes contenidos:Esto le permitirá iniciar una instancia de la consola powershell que se ejecuta en .NET 4.0.
Puede ver la diferencia en mi sistema donde tengo PowerShell 2.0 al examinar la salida de los siguientes dos comandos que se ejecutan desde cmd.
fuente
Aquí está el contenido del archivo de configuración que utilicé para admitir los ensamblados .NET 2.0 y .NET 4:
Además, aquí hay una versión simplificada del código compatible con PowerShell 1.0 que utilicé para ejecutar nuestros scripts a partir de los argumentos de la línea de comandos:
Además del manejo básico de errores que se muestra arriba, también inyectamos una
trap
declaración en el script para mostrar información de diagnóstico adicional (similar a la función Resolve-Error de Jeffrey Snover ).fuente
Las otras respuestas son anteriores a 2012, y se centran en "piratear" PowerShell 1.0 o PowerShell 2.0 para apuntar a versiones más nuevas de .NET Framework y Common Language Runtime (CLR).
Sin embargo, como se ha escrito en muchos comentarios, desde 2012 (cuando llegó PowerShell 3.0) una solución mucho mejor es instalar la versión más reciente de PowerShell . Apuntará automáticamente a CLR
v4.0.30319
. Esto significa .NET 4.0, 4.5, 4.5.1, 4.5.2 o 4.6 (esperado en 2015) ya que todas estas versiones son reemplazos in situ entre sí. Utilice$PSVersionTable
o vea el subproceso Determinar la versión instalada de PowerShell si no está seguro de su versión de PowerShell.Al momento de escribir, la versión más nueva de PowerShell es 4.0, y se puede descargar con el Marco de administración de Windows (enlace de búsqueda de Google) .
fuente
En realidad, puede hacer que PowerShell se ejecute usando .NET 4 sin afectar otras aplicaciones .NET. Necesitaba hacerlo para usar la nueva propiedad "Host" HttpWebRequest, sin embargo, cambiar el "OnlyUseLatestCLR" rompió Fiddler ya que no se podía usar en .NET 4.
Los desarrolladores de PowerShell obviamente previeron que esto sucedería, y agregaron una clave de registro para especificar qué versión del Framework debería usar. Un pequeño problema es que debe tomar posesión de la clave de registro antes de cambiarla, ya que incluso los administradores no tienen acceso.
Cambie el valor de esa clave a la versión requerida. Sin embargo, tenga en cuenta que algunos complementos ya no pueden cargarse a menos que sean compatibles con .NET 4 (WASP es el único con el que he tenido problemas, pero realmente no lo uso de todos modos). VMWare , SQL Server 2008 , PSCX, Active Directory (Microsoft y Quest Software ) y SCOM funcionan bien.
fuente
Si no desea modificar el registro o los archivos app.config, una forma alternativa es crear una aplicación de consola .NET 4 simple que imite lo que hace PowerShell.exe y aloja PowerShell ConsoleShell.
Consulte la Opción 2: Hospedaje de Windows PowerShell usted mismo
Primero, agregue una referencia a los ensamblados System.Management.Automation y Microsoft.PowerShell.ConsoleHost que se pueden encontrar en % programfiles% \ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0
Luego use el siguiente código:
fuente
Como otra opción, la última versión de PoshConsole incluye binarios dirigidos a .NET 4 RC (que funcionan bien con la versión RTM) sin ninguna configuración.
fuente
Simplemente ejecute powershell.exe con
COMPLUS_version
la variable de entorno establecida env4.0.30319
. Por ejemplo, desde cmd.exe o .bat-file:fuente