2009-05-22 9 views
14

Estoy usando la API System.Management.Automation para llamar a los scripts de PowerShell una aplicación C# WPF. En el siguiente ejemplo, ¿cómo cambiaría el directorio de inicio ($ PWD) para que ejecute foo.ps1 desde C: \ scripts \ en lugar de la ubicación del .exe desde el que se invocó?¿Configurando el directorio de inicio al llamar a Powershell desde .NET?

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    runspace.Open(); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@"C:\scripts\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 

Respuesta

8

No necesita cambiar el System.Environment.CurrentDirectory para cambiar la ruta de trabajo de sus scripts de PowerShell. Puede ser bastante peligroso hacer esto porque puede tener efectos secundarios involuntarios si está ejecutando otro código que es sensible a su directorio actual.

Puesto que usted está proporcionando una Runspace, todo lo que tiene que hacer es configurar las propiedades de la PathSessionStateProxy:

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    runspace.Open(); 
    runspace.SessionStateProxy.Path.SetLocation(directory); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@"C:\scripts\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 
+0

¿Hay una solución para las llamadas remotas? RemoteSessionStateProxy.Path arroja una PSNotSupportedException. – Rookian

+0

@Rookian: la ejecución del cmdlet 'Set-Location' puede ser su única opción en ese escenario. –

3

Cualquier cosa malo en hacer:

pipeline.Commands.AddScript(@"set-location c:\scripts;.\foo.ps1") 

?

-Oisin

1

Puede configurar el directorio de trabajo en PowerShell con el siguiente comando

set-location c:\mydirectory 

También puede probar su script de inicio PowerShell ($ perfil). C: \ Mis documentos .... \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 Pero sólo si este directorio es fijo y no cambia

6

Configuración System.Environment.CurrentDirectory antes de tiempo va a hacer lo que quiera.

En lugar de añadir Set-Location a su alforja, debe establecer System.Environment.CurrentDirectorycualquier momento antes de apertura el espacio de ejecución. Se heredan cualquiera que sea el CurrentDirectory es cuando se abre:

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    System.Environment.CurrentDirectory = "C:\\scripts"; 
    runspace.Open(); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@".\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 

Y recuerda, Set-Location no establece CurrentDirectory por lo que si usted está llamando a los métodos .Net de .NET Framework que trabajan en la "corriente" ubicación, necesita configurarlo usted mismo.

Cuestiones relacionadas