これはこの質問の続きです。作成した PowerShell コマンドがあり、PowerShell ウィンドウでコマンドを呼び出すことができますが、C# メソッドから呼び出そうとすると、コマンドレットが認識されないためエラーが発生します。他の既存のコマンドを試してみましたが、同じエラーが発生したため、モジュールのインポートに問題があると思われますが、ストリームではそのエラーは発生しません。エラー。私が得る唯一のエラーは、「Get-RowAndPartitionKey は認識された cmndlt ではありません。スペルを確認してください.....」です。
他の方法があるかどうかを知りたいのですが、試してみるか、ここでさらにデバッグして、モジュールがすべてのコマンドをフェッチするかどうかを確認してください。今、私はこれを修正する方法がわかりません。
public string RunScript( string contentScript, Dictionary<string, EntityProperty> parameters )
{
List<string> parameterList = new List<string>();
foreach( var item in parameters )
{
parameterList.Add( item.Value.ToString() );
}
using( PowerShell ps = PowerShell.Create() )
{
IAsyncResult async =
ps.AddCommand( "Import-Module" ).AddArgument( @"C:\Users\...\.D.PowerShell.dll" )
.AddStatement()
.AddCommand( "Get-RowAndPartitionKey" ).AddParameter( "Properties", "test" )
.BeginInvoke();
StringBuilder stringBuilder = new StringBuilder();
foreach( PSObject result in ps.EndInvoke( async ) )
{
stringBuilder.AppendLine( result.ToString() );
}
return stringBuilder.ToString();
}
}
}
以下のメソッドは、Streams.Error または Verbose でエラーを返しませんが、出力も返しません。
public async Task<IEnumerable<object>> RunScript( string scriptContents, List<string> scriptParameters )
{
// create a new hosted PowerShell instance using the default runspace.
// wrap in a using statement to ensure resources are cleaned up.
using( PowerShell ps = PowerShell.Create() )
{
// specify the script code to run.
ps.AddScript( scriptContents );
// specify the parameters to pass into the script.
ps.AddParameter( "Properties" ,"test") ;
// execute the script and await the result.
var pipelineObjects = await ps.InvokeAsync().ConfigureAwait( false );
return pipelineObjects;
}
}
スクリプトコンテンツ
"\"$path = 'C:\\Users...\\.TabularData.PowerShell.dll'\\r\\nImport-Module $path\\r\\nGet-RowAndPartitionKeys\""