Estoy actualizando un script de PowerShell que gestiona algunos .NET en las asambleas. El guión fue escrito por asambleas construido en contra de .NET 2 (el mismo de la versión de framework que PowerShell ejecuta con), pero ahora se necesita para trabajar con .NET 4 asambleas así como .NET 2 asambleas.
Desde .NET 4 permite ejecutar aplicaciones creadas con versiones anteriores del framework, parece que la solución más sencilla es ejecutar PowerShell con la .NET 4 en tiempo de ejecución cuando tengo que correr contra .NET 4 asambleas.
¿Cómo puedo ejecutar PowerShell con la .NET 4 tiempo de ejecución?
Respuestas
¿Demasiados anuncios?La mejor solución que he encontrado es en el post del blog de Usar la Versión más Reciente(s) de .NET con PowerShell. Esto permite que powershell.exe para ejecutar con .NET 4 asambleas.
Simplemente modificar (o crear) $pshome\powershell.exe.config
, de forma que contenga la siguiente:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
Adicional, rápida de notas de instalación:
Ubicaciones y archivos son algo que dependen de la plataforma; sin embargo, le dará una línea de esencia de cómo realizar la solución de trabajo para usted.
- Usted puede encontrar PowerShell ubicación en su ordenador ejecutando
cd $pshome
en la ventana de Powershell (no funciona desde el símbolo de sistema).- La ruta será algo como (ejemplo)
C:\Windows\System32\WindowsPowerShell\v1.0\
- La ruta será algo como (ejemplo)
- El nombre del archivo para poner la configuración es la siguiente:
powershell.exe.config
si suPowerShell.exe
está siendo ejecutado (crear el archivo de configuración, si es necesario).- Si
PowerShellISE.Exe
está ejecutando, entonces usted necesita para crear su compañero archivo de configuración comoPowerShellISE.Exe.config
- Si
PowerShell (el motor) funciona bien en .NET 4.0. PowerShell ( el host de la consola y el ISE) no, simplemente porque eran compilado con versiones anteriores de .NET. Hay un valor del registro que se cambie el .NET marco cargado todo el sistema, lo que permitirá el uso de PowerShell .NET 4.0 de clases:
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
Para actualizar la ISE para uso .NET 4.0, puede cambiar la configuración ($psHome\powershell_ise.exe.config) archivo de tener un trozo como este:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0.30319" />
</startup>
</configuration>
Usted puede construir .NET 4.0 de aplicaciones que llame PowerShell con el PowerShell API (System.Management.Automation.Powershell) bien, pero estos pasos le ayudará a conseguir las en-el-cuadro de PowerShell hosts para trabajar bajo .NET 4.0
Espero que esto ayude
Por favor sea MUY cuidadoso con el uso de la clave de registro de enfoque. Estos son de todo el equipo teclas y forcibily migrar TODAS las aplicaciones .NET 4.0.
Muchos de los productos no funcionan si forcibily migrado y esta es una prueba de la ayuda y no una producción de calidad de mecanismo. Visual Studio 2008 y 2010, MSBuild, turbotax, y una serie de sitios web, SharePoint y no se debe automigrated.
Si necesita utilizar PowerShell con 4.0, esto debe hacerse en cada aplicación con un archivo de configuración, usted debería consultar con el PowerShell equipo en la recomendación precisa. Esto es probable que romper algunos comandos de PowerShell.
Si usted sólo necesita ejecutar un solo comando, bloque de secuencia de comandos o archivo de secuencia de comandos en .NET 4, trate de usar la Activación de los Archivos de Configuración de .NET 4 para iniciar una única instancia de PowerShell con la versión 4 de CLR:
http://msdn.microsoft.com/en-us/library/ff361644.aspx
Todos los detalles:
http://blog.codeassassin.com/2011/03/23/executing-individual-powershell-commands-using-net-4/
Un ejemplo de módulo de PowerShell:
https://gist.github.com/882528
Aquí es el contenido del archivo de configuración que he usado para apoyar tanto .NET 2.0 y .NET 4 asambleas:
<?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>
También, aquí tienes una versión simplificada de la PowerShell 1.0 compatible de código que he usado para ejecutar nuestros scripts desde el pasado en argumentos de línea de comandos:
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;
}
}
}
Además de los básicos de manejo de error mostrado anteriormente, también podemos inyectar trap
declaración en la secuencia de comandos para mostrar información adicional de diagnóstico (similar a Jeffrey Snover de Resolver-Error de la función).