2

stackoverflow からの 2 つの回答を結合しようとしました (最初2 番目)

InitialSessionState iss = InitialSessionState.CreateDefault();
// Override ExecutionPolicy

PropertyInfo execPolProp = iss.GetType().GetProperty(@"ExecutionPolicy");
if (execPolProp != null && execPolProp.CanWrite)
{
    execPolProp.SetValue(iss, ExecutionPolicy.Bypass, null);
}
Runspace runspace = RunspaceFactory.CreateRunspace(iss);
runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();

//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfile);
CommandParameter testParam = new CommandParameter("key","value");
myCommand.Parameters.Add(testParam);

pipeline.Commands.Add(myCommand);

// Execute PowerShell script
results = pipeline.Invoke(); 

私のpowershellスクリプトには、次のパラメーターがあります。

Param(
[String]$key
)

ただし、これを実行すると、次の例外が発生します。

System.Management.Automation.CmdletInvocationException: Cannot validate argument on parameter 'Session'. 
The argument is null or empty. 
Provide an argument that is not null or empty, and then try the command again.
4

1 に答える 1

3

特定の問題が何であるかを知らなくても、C# コードを大幅に簡素化できることに注意してください。これにより、問題も解決される可能性があります。

  • セッションの実行ポリシーを設定するためにリフレクションに頼る必要はありません。

  • クラスのインスタンスを使用すると、PowerShellコマンドの呼び出しが大幅に簡素化されます。

// Create an initial default session state.
var iss = InitialSessionState.CreateDefault2();
// Set its script-file execution policy (for the current session only).
iss.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass;

// Create a PowerShell instance with a runspace based on the 
// initial session state.
PowerShell ps = PowerShell.Create(iss);

// Add the command (script-file call) and its parameters, then invoke.
var results =
  ps
   .AddCommand(scriptfile)
   .AddParameter("key", "value")
   .Invoke();

注: このメソッドは、PowerShell スクリプトの実行中に終了.Invoke()エラーが発生した場合にのみ例外をスローします。より典型的な非終了エラーは、代わりに を介して報告されます。.Streams.Error

于 2021-08-26T17:01:14.520 に答える