2009-05-22 3 views
14

System.Management.Automation API를 사용하여 C# WPF 앱인 PowerShell 스크립트를 호출합니다. 다음 예제에서는 시작 디렉토리 ($ PWD)를 어떻게 변경하여 호출 된 .exe의 위치 대신 C : \ scripts \에서 foo.ps1을 실행합니까?.NET에서 Powershell을 호출 할 때 시작 디렉토리 설정?

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

을 : 일을 잘못

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

답변

8

PowerShell 스크립트의 작업 경로를 변경하기 위해 System.Environment.CurrentDirectory을 변경할 필요가 없습니다. 현재 디렉터리에 민감한 다른 코드를 실행하는 경우 의도하지 않은 부작용이 발생할 수 있으므로 매우 위험 할 수 있습니다.

당신이 Runspace을 제공하고 있기 때문에, 당신은 SessionStateProxyPath 속성을 설정해야 할 모든 :

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

원격 호출에 대한 해결책이 있습니까를? RemoteSessionStateProxy.Path가 PSNotSupportedException을 발생시킵니다. – Rookian

+0

@Rookian :이 시나리오에서는 'Set-Location' cmdlet을 실행하는 것이 유일한 선택 일 수 있습니다. –

3

아무것도?

-Oisin

1

다음과 같은 명령

set-location c:\mydirectory 

와 PowerShell의 작업 디렉토리를 설정할 수 있습니다 당신은 또한 당신의 PowerShell을 시작 스크립트 ($ 프로파일)을 시도 할 수 있습니다. C : .... \ mydocs 다음 \의 WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 그러나이 디렉토리가 고정되어

6

당신이 원하는 것을 할 것입니다 시간 앞서 System.Environment.CurrentDirectory 설정을 변경하지 않는 경우에만.

오히려 당신의 전대에 Set-Location을 추가하는 대신, 당신은 개방 실행 영역 전에 System.Environment.CurrentDirectory언제든지 을 설정해야합니다. , Set-Location는 "현재"위치에 .NET 프레임 워크의 CurrentDirectory 당신이 전화하는거야 그렇다면 닷넷 방법 작업을 설정하지 않습니다,

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

을 그리고 기억을 : 그것은 열려있어 때은 CurrentDirectory 무엇이든 상속 직접 설정해야합니다.