2009-05-22 1 views
14

Sto utilizzando l'API System.Management.Automation per chiamare gli script PowerShell un'app WPF C#. Nell'esempio seguente, come cambieresti la directory di avvio ($ PWD) in modo che esegua foo.ps1 da C: \ scripts \ invece della posizione del file .exe da cui è stato chiamato?Impostazione della dir di start quando si chiama Powershell da .NET?

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

risposta

8

Non è necessario modificare System.Environment.CurrentDirectory per modificare il percorso di lavoro degli script di PowerShell. Può essere piuttosto pericoloso farlo perché questo potrebbe avere effetti collaterali non intenzionali se si sta eseguendo un altro codice che è sensibile alla directory corrente.

Dal momento che si sta fornendo un Runspace, tutto quello che dovete fare è impostare le proprietà sul 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

C'è una soluzione per le chiamate a distanza? RemoteSessionStateProxy.Path genera un'eccezione PSNotSupportedException. – Rookian

+0

@Rookian: l'esecuzione del cmdlet 'Set-Location' può essere l'unica scelta in tale scenario. –

3

Qualche cosa di sbagliato nel fare:

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

?

-Oisin

1

È possibile impostare la directory di lavoro in PowerShell con il seguente comando

set-location c:\mydirectory 

Potete anche provare lo script di avvio di PowerShell ($ profilo). C: \ .... MyDocs \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 Ma solo se questa directory è fisso e non cambia

6

Impostazione System.Environment.CurrentDirectory prima del tempo farà quello che vuoi.

Invece di aggiungere al vostro Set-Location bisaccia, è necessario impostare System.Environment.CurrentDirectoryqualsiasi momento prima apertura la spazio di esecuzione. Esso erediterà qualunque sia il CurrentDirectory è quando è aperto:

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

E ricordate, Set-Location non impostato CurrentDirectory quindi se si sta chiamando i metodi Net del .net framework che lavoro sulla posizione "corrente", è è necessario impostare da soli.