2010-09-15 11 views
5

estoy usando este C#:¿Por qué la invocación de PowerShell desde C# arroja una System.Management.Automation.CommandNotFoundException?

public bool RunPowershell(string script) 
    { 
     RunspaceConfiguration runspaceConfig = RunspaceConfiguration.Create(); 

     using (Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfig)) 
     { 
      runspace.Open(); 

      using (RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace)) 
      { 
       scriptInvoker.Invoke(script); 
      } 
     } 

     return true; 
    } 

Para ejecutar este script:

 Add-PSSnapin -name Microsoft.SystemCenter.VirtualMachineManager 
     $vmm = Get-VMMServer -ComputerName "VmmComputerName" 

Funciona bien en un sistema operativo de 32 bits de Windows 2003, pero en una de 64 bits de Windows 2008R2, me sale este error:

System.Management.Automation.CommandNotFoundException: The term 'Get-VMMServer' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
at System.Management.Automation.CommandDiscovery.LookupCommandInfo(String commandName, CommandOrigin commandOrigin) 
at System.Management.Automation.CommandDiscovery.LookupCommandProcessor(String commandName, CommandOrigin commandOrigin, Nullable`1 useLocalScope) 
at System.Management.Automation.CommandFactory._CreateCommand(String commandName, CommandOrigin commandOrigin, Nullable`1 useLocalScope) 
at System.Management.Automation.ExecutionContext.CreateCommand(String command) 
at System.Management.Automation.CommandNode.CreateCommandProcessor(Int32& index, ExecutionContext context) 
at System.Management.Automation.CommandNode.AddToPipeline(PipelineProcessor pipeline, ExecutionContext context) 
at System.Management.Automation.PipelineNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context) 
at System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ExecutionContext context) 
at System.Management.Automation.AssignmentStatementNode.Execute(Array input, Pipe outputPipe, ExecutionContext context) 
at System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputPipe, ArrayList& resultList,  ExecutionContext context) 

Y, tengo instalado Microsoft.SystemCenter.VirtualMachineManager. El script también funciona si lo escribo manualmente en la consola power-shell en la máquina 2008R2.

¿Puedes ayudarme con cualquier idea sobre lo que me podría estar perdiendo?

Muchas gracias.

Respuesta

7

Esto ocurre porque los metadatos snap-in de powershell se registran en el registro. En su caso, esto significa que la información del complemento solo está disponible en la sección de software de 32 bits del registro. Normalmente, el truco para hacerlo disponible es usar la versión de 64 bits de installutil.exe de .NET Framework (en el directorio framework64) para registrarla, pero a veces solo es de 32 bits por un motivo. Puede estar dependiendo de los objetos COM de 32 bits que no están disponibles en un entorno de 64 bits.

lo que tiene dos enfoques:

1) registrar el complemento de 64 bits utilizando installutil.exe/i (poco probable que funcione)

o

2) se dirigen a su. exe NET para 32 bits sólo a través de las propiedades del proyecto VS (Cualquier CPU -> 86)

o

3) envolver su trabajo en un script como el siguiente: http://www.nivot.org/blog/post/2012/12/18/Ensuring-a-PowerShell-script-will-always-run-in-a-64-bit-shell

-Oisin

+0

Sí, creo que tienes razón. Aunque, en mi caso, creo que podría haber terminado con eso al revés. Mi programa C# se lanza desde un proceso WOW64 (construcción TFS), por lo que termina ejecutándose como un proceso de 32 bits. Pero, el snapin solo está disponible cuando powershell se ejecuta como nativo de 64 bits. Muchas gracias. –

+0

Estoy pensando que podría usar algo como esto: http://stackoverflow.com/questions/2003573/how-to-start-a-64-bit-process-from-a-32-bit-process para volver a la tierra natal de 64 bits. –

+2

¿Pudiste hacer esto? Estoy atascado con un problema similar y me gustaría saber cómo resolvió esto – satyajit

Cuestiones relacionadas