2009-05-22 6 views
14

Ich verwende die API System.Management.Automation, um PowerShell-Skripts eine C# -WPF-App aufzurufen. Wie würden Sie im folgenden Beispiel das Startverzeichnis ($ PWD) ändern, so dass foo.ps1 von C: \ scripts \ anstelle des Standorts der .exe ausgeführt wird, von der es aufgerufen wurde?Einstellen des Startverzeichnisses beim Aufruf von Powershell von .NET?

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

Antwort

8

Sie müssen die System.Environment.CurrentDirectory nicht ändern, um den Arbeitspfad für Ihre PowerShell-Skripts zu ändern. Es kann ziemlich gefährlich sein, dies zu tun, da dies unbeabsichtigte Nebenwirkungen haben kann, wenn Sie anderen Code ausführen, der für Ihr aktuelles Verzeichnis empfindlich ist.

Da Sie eine Runspace bietet alles, was Sie tun müssen, um die Path Eigenschaften auf der SessionStateProxy gesetzt:

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

Gibt es eine Lösung für Ferngespräche? RemoteSessionStateProxy.Path löst eine PSNotSupportedException aus. – Rookian

+0

@Rookian: Das Ausführen des Cmdlets "Set-Location" ist möglicherweise die einzige Möglichkeit in diesem Szenario. –

3

Stimmt etwas mit zu tun:

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

?

-Oisin

1

Sie können das Arbeitsverzeichnis in Powershell-Set mit dem folgenden Befehl

set-location c:\mydirectory 

Sie können auch Ihren Powershell-Startskript ($ Profil) versuchen. C: .... \ MyDocs \ Windows \ Microsoft.PowerShell_profile.ps1 Aber nur, wenn dieses Verzeichnis festgelegt ist und sich nicht ändert

6

System.Environment.CurrentDirectory vor der Zeit einstellen wird tun, was Sie wollen.

Anstatt Set-Location zu Ihrem Scrip hinzufügen, sollten Sie System.Environment.CurrentDirectoryjederzeit vor Öffnung die Runspace gesetzt. Es wird erben, was auch immer das ist Current, wenn es geöffnet ist:

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(); 
} 

Und denken Sie daran, Set-Location nicht das .NET Framework die nicht gesetzt CurrentDirectory also, wenn Sie anrufen .Net Methoden, die Arbeit an der „aktuellen“ Lage, Sie muss es selbst einstellen.

Verwandte Themen