2009-05-22 12 views
14

PowerShell komut dosyalarını bir C# WPF uygulamasını çağırmak için System.Management.Automation API'sini kullanıyorum. Aşağıdaki örnekte, başlangıç ​​dizinini ($ PWD) nasıl değiştirirsiniz, böylece foo.ps1, çağrıldığı .exe dosyasının yeri yerine C: \ scripts \ dizininden yürütülür?.NET'ten Powershell'i çağırırken başlangıç ​​dirsini ayarlama?

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

: yapıyor yanlış

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

cevap

8

PowerShell komut dosyalarınızın çalışma yolunu değiştirmek için System.Environment.CurrentDirectory'u değiştirmeniz gerekmez. Bunu yapmak için oldukça tehlikeli olabilir, çünkü mevcut dizininize duyarlı başka bir kod çalıştırıyorsanız, bu durumun istenmeyen yan etkileri olabilir.

Bir Runspace sağlayarak olduğundan başlamaya SessionStateProxy üzerinde Path özelliklerini ayarlanır yapmanız gereken:

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

uzak çağrılar için bir çözüm var mı? RemoteSessionStateProxy.Path bir PSNotSupportedException atar. – Rookian

+0

@Rookian: 'Set-Location' cmdlet'ini çalıştırmak bu senaryodaki tek seçiminiz olabilir. –

3

şey var mı?

-Oisin

1

Aşağıdaki komutu

set-location c:\mydirectory 

ile powershell çalışma dizinini ayarlayabilirsiniz Ayrıca PowerShell başlangıç ​​komut dosyası ($ profili) deneyebilirsiniz. C: .... \ MyDocs \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 Ama bu dizini sabittir ve

6

istediğini yapacak vaktinden System.Environment.CurrentDirectory Ayar değişmez sadece.

Aksine sizin scrip için Set-Location ekleyerek yerine, açılış Runspace önce System.Environment.CurrentDirectoryher zaman ayarlamalısınız. , Set-Location "geçerli" konumunda .net çerçevenin CurrentDirectory aradığınız eğer öyleyse .Net yöntemlerini çalışma belirlemez,

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

Ve unutmayın size: O açtı zaman CurrentDirectory ne olursa olsun devralır Kendiniz ayarlamanız gerekir.

İlgili konular