2009-05-22 33 views
14

Tôi đang sử dụng API System.Management.Automation để gọi các tập lệnh PowerShell là ứng dụng C# WPF. Trong ví dụ sau, làm thế nào bạn sẽ thay đổi thư mục bắt đầu ($ PWD) để nó thực hiện foo.ps1 từ C: \ scripts \ thay vì vị trí của .exe nó được gọi là từ?Đặt thư mục bắt đầu khi gọi Powershell từ .NET?

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

Trả lời

8

Bạn không cần thay đổi System.Environment.CurrentDirectory để thay đổi đường dẫn hoạt động cho tập lệnh PowerShell của mình. Nó có thể khá nguy hiểm để làm điều này bởi vì điều này có thể có tác dụng phụ không chủ ý nếu bạn đang chạy mã khác nhạy cảm với thư mục hiện tại của bạn.

Vì bạn đang cung cấp một Runspace, tất cả các bạn cần làm là thiết lập các thuộc tính Path trên SessionStateProxy:

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ó một giải pháp cho các cuộc gọi từ xa? RemoteSessionStateProxy.Path đưa ra một PSNotSupportedException. – Rookian

+0

@Rookian: Chạy lệnh ghép ngắn 'Set-Location' có thể là lựa chọn duy nhất của bạn trong trường hợp đó. –

3

Bất cứ điều gì sai với thực hiện:

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

?

-Oisin

1

Bạn có thể thiết lập các thư mục làm việc trong PowerShell với lệnh sau đây

set-location c:\mydirectory 

Bạn cũng có thể thử kịch bản khởi động PowerShell của bạn ($ hồ sơ). C: .... \ MyDocs \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 Nhưng chỉ khi thư mục này là cố định và không thay đổi

6

Thiết System.Environment.CurrentDirectory trước thời hạn sẽ làm những gì bạn muốn.

Thay vì thêm Set-Location để scrip của bạn, bạn nên đặt System.Environment.CurrentDirectorybất cứ lúc nào trước mở các Runspace. Nó sẽ thừa hưởng bất cứ CurrentDirectory là khi nó được mở ra:

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

Và hãy nhớ, Set-Location không đặt CurrentDirectory vì vậy nếu bạn đang gọi điện thoại phương pháp Net khung lưới của mà làm việc trên "hiện tại" vị trí, bạn cần tự mình đặt.

Các vấn đề liên quan