2009-05-22 5 views
14

私はSystem.Management.Automation APIを使用してC#WPFアプリケーションのPowerShellスクリプトを呼び出しています。次の例では、起動ディレクトリ($ PWD)をどのように変更して、呼び出された.exeの場所の代わりにC:\ scripts \からfoo.ps1を実行するのでしょうか?.NETからPowershellを呼び出すときの開始ディレクトリを設定しますか?

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'コマンドレットを実行することが唯一の選択肢かもしれません。 –

3

やっに何か問題:

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

-Oisin

1

あなたは、次のコマンド

set-location c:\mydirectory 

でPowerShellでの作業ディレクトリを設定することができます。また、あなたのPowerShellの起動スクリプト($プロファイル)を試すことができます。 C:.... \ mydocsと\ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 しかし、このディレクトリが固定され、

6

はあなたがやりたいだろう前もってSystem.Environment.CurrentDirectory設定変更しない場合にのみ。

むしろあなたのスクリップにSet-Locationを追加するよりも、あなたは開口部実行空間の前にSystem.Environment.CurrentDirectoryいつでもを設定する必要があります。それはは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(); 
} 

そして、あなたは「現在」の場所での作業.NETメソッドを呼び出している場合Set-Locationがそうの.NET FrameworkのCurrentDirectoryを設定していない、覚えて、あなたそれを自分で設定する必要があります。

関連する問題