190 votos

¿Cómo puedo ejecutar PowerShell con el Framework 4 tiempo de ejecución?

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?

196voto

cmo999 Puntos 1699

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\
  • El nombre del archivo para poner la configuración es la siguiente: powershell.exe.config si su PowerShell.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 como PowerShellISE.Exe.config

116voto

Start-Automating Puntos 3953

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

28voto

Madhu Talluri Puntos 269

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.

24voto

Jason Stangroome Puntos 2264

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

15voto

Emperor XLII Puntos 5493

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).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X