趣旨
.NET アプリケーションからPowerShellを実行するケースにおいて、
外部のps1スクリプトを呼び出す時、単純に呼び出すとエラーとなります。
ハンドルされていない例外: System.Management.Automation.PSSecurityException: このシステムではスクリプトの実行が無効になっているため、ファイル Verb-Noun.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。 ---> System.UnauthorizedAccessException: このシステムではスクリプトの実行が無効になっているため、ファイル Verb-Noun.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
--- 内部例外スタック トレースの終わり ---
場所 System.Management.Automation.Runspaces.AsyncResult.EndInvoke()
場所 System.Management.Automation.PowerShell.EndInvoke(IAsyncResult asyncResult)
場所 ConsoleApplication1.Program.Main(String[] args) 場所 Program.cs:行 84
この問題を解決する方法を共有します。
使用するコマンドが事前に用意される場合
Sample.cs
var config = RunspaceConfiguration.Create( );
{
config.Scripts.Prepend( name: "Verb-Noun", definition: $"{script ...}" );
}
using ( var rs = RunspaceFactory.CreateRunspace( config ) )
using ( var ps = PowerShell.Create( ) )
{
rs.Open( );
ps.Runspace = rs;
ps.AddCommand( cmdlet: "Verb-Noun" )
.Invoke( );
}
実行中に用意される場合
Sample.cs
var state = InitialSessionState.CreateDefault( ); // or CreateDefault2, Create
{
state.ExecutionPolicy = ExecutionPolicy.RemoteSigned; // or Unrestricted
}
using ( var rs = RunspaceFactory.CreateRunspace( state ) )
using ( var ps = PowerShell.Create( ) )
{
rs.Open( );
ps.Runspace = rs;
ps.AddCommand( cmdlet: ".\\Verb-Noun.ps1" )
.Invoke( );
}